

c言語を勉強中の初心者です。
プログラムで、struct structB; と宣言をしたのですがエラーになります。
このように、構造体にお互いの構造体を、要素にすることはできないのでしょうか。
どうすればエラーが出なくなるのでしょうか。
どなたかご教授ください
○プログラムリスト
#include <stdio.h>
struct structB;
struct structA {
double a;
struct structB b; /* エラー */
};
struct structB {
int c;
struct structA *d;
};
int main(void)
{
struct structA x = {3.2, {3, NULL}};
struct structB y = {2, NULL};
printf("%lf\n", x.a);
printf("%d\n", y.c);
return 0;
}
○実行例
C:\>cl.exe mytest.c
Microsoft(R) 32-bit C/C++ Standard Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.
mytest.c
mytest.c(7) : error C2079: 'b' が 未定義の struct 'structB' で使用しています。
mytest.c(18) : error C2078: 初期化子の数が多すぎます。
C:\>
○実行環境
Microsoft WindowsXP Professional SP2
Microsoft Visual C++ .NET Standard Version 2003
No.1ベストアンサー
- 回答日時:
がると申します。
んっと、単純にコンパイルエラーになっている理由は
struct structA {
double a;
struct structB b; /* エラー */
};
を
struct structA {
double a;
struct structB *b; /* ポインタ型に修正 */
};
すればなおります。
で。
「構造体にお互いの構造体を、要素にすることは」、これは絶対に出来ないです。なぜなら、その構造体のサイズ解決で永久ループになるためです。
質問者さんが実際にされているのは「構造体にお互いの構造体"へのポインタ"を、要素にすることは」、これは可能です。
言葉としては微妙な違いですが中身はかなりでかく違うので、気にされるとよいかもしれません。
あと、今回のプログラムの構造体であれば、unionを使うのも手です。
struct structAB {
union {
double a;
int c;
} data;
struct structAB *ab;
};
No.3
- 回答日時:
金庫の鍵は金庫の中という状態ですので
エラーが出ます。
すなわち、structBが定義されていないのに,使用しているからです。
#include <iostream>
typedef struct _tagstructA{
double a;
void *b;
} structA;
typedef struct _tagstructB{
int c;
void *a;
} structB;
typedef struct _tagstructC{
structA *a;
structB *b;
} structC;
int main()
{
char sample[] = "SAMPLE STRINGS.";
structB y = {2, NULL};
structA x = {3.2, (char *)sample};
structC z = {&x, &y};
std::cout << "structC z.a->a = [" << z.a->a << "], z.a->b = [" << (char *)z.a->b << "]" << std::endl;
std::cout << "structA z.b->c = [" << z.b->c << "], z.b->a = [" << z.b->a << "]" << std::endl;
}
結果
structC z.a->a = [3.2], z.a->b = [SAMPLE STRINGS.]
structA z.b->c = [2], z.b->a = [0x0]
GNU C++ で確認済み
hegemonism様
ソースコード付きの詳解ありがとうございます。
ソースコードのある解答は、助かります。
ところで、ポイント発行ですが、どの解答も勉強になります。
それで悩んだのですが、ポイントは先着順にさせていただきます。
ごめんなさい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# 未解決の外部シンボル _printfが関数_mainで参照されました 1 2022/09/18 15:28
- C言語・C++・C# プログラムが書けません。 4 2023/01/22 22:57
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# leetcode21 1 2022/04/21 11:53
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
C++のfor文について
-
main.c:7:43: warning: implici...
-
newで生成したものをdelete[]で...
-
構造体の宣言でエラーが出ます。
-
2重定義って??
-
intとINTの違いは?
-
void func( void )について
-
呼び出し時のパラメータが足りない
-
64bit → 32bit型へのキャスト
-
VC6でlong longでエラー?
-
引数で argc argvが使用され...
-
エラー「invalid conversion fr...
-
namespace定義の使い方
-
visualstudio C# テキストボッ...
-
staticで初期化した変数(?)を使...
-
main()とint main(void)の違い
-
プログラムの中で別のmainを呼...
-
VB 関数
-
【#define】 defineで定義した...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
long型の定数の末尾にLを付ける...
-
main.c:7:43: warning: implici...
-
2重定義って??
-
変数の型を定義しなかった場合...
-
C++でboolにintの値を代入する...
-
typedef enumの使い方を教えて...
-
C++のfor文について
-
intとINTの違いは?
-
【#define】 defineで定義した...
-
ハンドルされていない例外が発...
-
void func( void )について
-
C言語のコンパイルエラー
-
enumについて
-
関数の実体定義にヘッダファイ...
-
C言語 宣言した変数になにも代...
-
C++ クラスをメンバにもつクラ...
-
プログラムの中で別のmainを呼...
-
sshdログの意味
おすすめ情報