- ベストアンサー
構造体の初期設定でエラーが発生する理由と解決方法
- C++言語で構造体の初期設定を行う際に発生するエラーについて詳しく解説します。
- エラーの原因は、9行目のコードで構文エラーが発生していることです。
- エラーを解決するためには、9行目のコードを修正する必要があります。具体的な修正方法について解説します。
- みんなの回答 (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; } という書き方も出来ますね。
その他の回答 (3)
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
「ポインタ」は「変数のアドレス」しか初期化や代入が出来ない。 なので 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)); }
お礼
ポインタには一発で、変数の値をいれることはできないことが理解できました。 ありがとうございます。
- magicalpass
- ベストアンサー率58% (378/648)
9行目のような構文は、変数宣言の初期化構文としてしか使えません。 struct strData strc = {5,(int*)6}; という形でならOKです。 それより、 > struct strData *strc; strcは構造体へのポインタですが、初期化されていません。(指している構造体がありません) そのポインタの先に構造体データを代入しようとしています。 またstrData構造体の要素bが本当にint型のポインタを意味するデータだとしたら、 > (int*)6 などという即値を代入しているのもどうかと思います。 (組込等の環境でアドレス6番地がそのための領域として確保されているのなら話は別ですが)
お礼
構造体のポインタ*strcの宣言の前に、構造体の実体がないと意味がないことが理解できました。 ありがとうございます。
- Tacosan
- ベストアンサー率23% (3656/15482)
これはエラーになって当然. あなたはどういう風になってほしいの?
補足
構造体*strcにa,*bの値の設定をしたいのです。
お礼
丁寧なご回答ありがとうございます。 構造体のポインタの値の初期化は一度にはできなく、 なんどか手順を踏まないとできないのですね。