• 締切済み

構造体へのポインタ

typedef struct str_tmp_t{ int a; char b; } str_tmp; void main() { str_tmp *str_info; str_info->a = 1; } とした場合、コンパイルエラーは出てはいないのですが、数値を代入している個所で落ちてしまいます。 これを回避するには単純にmallocしてfreeすれば良いのでしょうか? よろしくお願い致します。

みんなの回答

noname#3823
noname#3823
回答No.4

str_tmp *str_info の宣言はこのstr_tmp型データのアドレスを入れる場所をstr_infoという名前で確保しただけです。 今の段階でアドレスは不定(でたらめ)です。 アドレスが不定なのにデータを入れるのは間違いです。 親切なコンパイラだと代入した段階でoutでしょうね。 領域確保の関数にアドレスをもらってそのアドレスをstr_infoに入れましょう。 そうすれば初めて代入できます。

  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.3

原因は#1さんの通りでしょう。 でもなぜ、ポインタ変数を定義してるんでしょう? (実体はどこに入れるんでしょう) 素直に実体を定義すればいいんじゃないでしょうか。 void main() { str_tmp str_info; str_info.a = 1; }

  • furlong
  • ベストアンサー率50% (17/34)
回答No.2

本当にポインターを使う必要があるのですか。この場合、バグの素になりやすい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)
回答No.1

そりゃあ落ちるでしょう。 だって、宣言文だけで実際にポインタにアドレスが設定されてませんから。 ポインタでmallocしてから、代入してください。

専門家に質問してみよう