1

私は2つのファイルに次のプログラムを持っています

main.cpp

    float POW10[300];
    main(0
    {
        Fill_POW10();
    }

Fill.cpp

extern float *POW10;
Fill_POW10()
{
  for(int i=0;i<300;i++)
  {
    POW10[i]=i;
  }
}

これは、セグメンテーション違反でクラッシュしました。調べると、POW10 は NULL です。ただし、 Fill.cpp を次のように変更すると

extern float POW10[];
Fill_POW10()
{
  for(int i=0;i<300;i++)
  {
    POW10[i]=i;
  }
}

コードは正常に動作します。POW10 は実際には float へのポインターとして実装されているため、コードは同一である必要があると考えていました。そうではない理由を教えてください。

4

4 に答える 4

1

最初に、問題を説明する次のエントリをお読みください。

http://c-faq.com/aryptr/aryptr1.html

次に、配列とポインターの違いを説明するこのフォローアップをお読みください。

http://c-faq.com/aryptr/aryptr2.html

于 2013-05-01T17:37:47.923 に答える
0

リンカは float * POW10 宣言を float POW10[] 定義に解決しているのではなく、実際には完全に別の定義を作成しているため、初期化されていない (経験したように NULL) ことになります。

于 2013-05-01T17:35:31.423 に答える