• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:構造体の初期設定 (C++))

構造体の初期設定でエラーが発生する理由と解決方法

このQ&Aのポイント
  • C++言語で構造体の初期設定を行う際に発生するエラーについて詳しく解説します。
  • エラーの原因は、9行目のコードで構文エラーが発生していることです。
  • エラーを解決するためには、9行目のコードを修正する必要があります。具体的な修正方法について解説します。

質問者が選んだベストアンサー

  • ベストアンサー
  • knb-nkm
  • ベストアンサー率66% (4/6)
回答No.4

他の方も書いてますが、ポインタの使い方がまずいですね。 あえて書くとしたら、こんな感じでしょうか。 #include <iostream> struct strData { int a; int *b; }; int main(void) { int b = 6; strData strc = {5, &b}; // strc.b には、ポインターを渡す。 std::cout << strc.a << std::endl; std::cout << *strc.b << std::endl; return 0; } あるいは、6番地のアドレスを本当に渡したいなら #include <iostream> struct strData { int a; int *b; }; int main(void) { strData strc = {5, (int *)6}; std::cout << strc.a << std::endl; std::cout << (long)strc.b << std::endl; // 00006番地にアクセスするとたいてい怒られるので // アドレスの値をプリント(--; return 0; } struct も class と同様にコンストラクタを持つ事が出来ますから、 #include <iostream> struct strData { int a; int *b; strData(int a_, int *b_) { a = a_; b = b_; } }; int main(void) { int b = 6; strData *strc; strc = new strData(5, &b); std::cout << strc->a << std::endl; std::cout << *strc->b << std::endl; return 0; } という書き方も出来ますね。

saladman
質問者

お礼

丁寧なご回答ありがとうございます。 構造体のポインタの値の初期化は一度にはできなく、 なんどか手順を踏まないとできないのですね。

その他の回答 (3)

回答No.3

「ポインタ」は「変数のアドレス」しか初期化や代入が出来ない。 なので int *b = (int *)6; と書いても、プログラムは期待通りには動作しない(不正なメモリをアクセスして強制終了する) 同様に *strc = {5,(int*)6}; と書く事もできない(構文エラーになる) その両方の制限を回避して書くと以下のようになるが「やっちゃいけない事をやっている」し「特定の環境下ででしか動作しない」ので、推奨は出来ない。 struct strData{ int a; int *b; }; void main(void) { struct strData s = {5,(int *)"\x06\0\0\0"}; struct strData *strc = &s; printf("strc->a:%d\nstrc->b:%p\n",strc->a,strc->b); printf("*(strc->b):%d\n",*(strc->b)); }

saladman
質問者

お礼

ポインタには一発で、変数の値をいれることはできないことが理解できました。 ありがとうございます。

回答No.2

9行目のような構文は、変数宣言の初期化構文としてしか使えません。 struct strData strc = {5,(int*)6}; という形でならOKです。 それより、 > struct strData *strc; strcは構造体へのポインタですが、初期化されていません。(指している構造体がありません) そのポインタの先に構造体データを代入しようとしています。 またstrData構造体の要素bが本当にint型のポインタを意味するデータだとしたら、 > (int*)6 などという即値を代入しているのもどうかと思います。 (組込等の環境でアドレス6番地がそのための領域として確保されているのなら話は別ですが)

saladman
質問者

お礼

構造体のポインタ*strcの宣言の前に、構造体の実体がないと意味がないことが理解できました。 ありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

これはエラーになって当然. あなたはどういう風になってほしいの?

saladman
質問者

補足

構造体*strcにa,*bの値の設定をしたいのです。

関連するQ&A