- 締切済み
構造体へのポインタ
typedef struct str_tmp_t{ int a; char b; } str_tmp; void main() { str_tmp *str_info; str_info->a = 1; } とした場合、コンパイルエラーは出てはいないのですが、数値を代入している個所で落ちてしまいます。 これを回避するには単純にmallocしてfreeすれば良いのでしょうか? よろしくお願い致します。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
str_tmp *str_info の宣言はこのstr_tmp型データのアドレスを入れる場所をstr_infoという名前で確保しただけです。 今の段階でアドレスは不定(でたらめ)です。 アドレスが不定なのにデータを入れるのは間違いです。 親切なコンパイラだと代入した段階でoutでしょうね。 領域確保の関数にアドレスをもらってそのアドレスをstr_infoに入れましょう。 そうすれば初めて代入できます。
- MovingWalk
- ベストアンサー率43% (2233/5098)
原因は#1さんの通りでしょう。 でもなぜ、ポインタ変数を定義してるんでしょう? (実体はどこに入れるんでしょう) 素直に実体を定義すればいいんじゃないでしょうか。 void main() { str_tmp str_info; str_info.a = 1; }
- furlong
- ベストアンサー率50% (17/34)
本当にポインターを使う必要があるのですか。この場合、バグの素になりやすいmallocとfreeを持ち出さずに、次のような書き方をすれば良いと思います。 int sub (str_tmp *s); void main () { str_tmp str_info; str_info.a = 1; sub (&str_info); } 又は、 void main () { str_tmp str_info [1]; str_info->a = 1; sub (str_info); }
- PAPA0427
- ベストアンサー率22% (559/2488)
そりゃあ落ちるでしょう。 だって、宣言文だけで実際にポインタにアドレスが設定されてませんから。 ポインタでmallocしてから、代入してください。