0

したがって、最初はサイズが不明な配列(コマンドラインからユーザーから取得する)が必要ですが、グローバルにアクセスできる(メイン外)必要があります。

だからここに私がすることがあります:

 //.h file declaration
 typedef struct res
 {
   int popultaion[NB_TYPE];
   int alive;
   int birthat[NB_TYPE];
 }res_t;

 //.c file
 res_t* res_first = NULL;

 int main(int argc, char* argv[])
 {
    int no_of_mutants = atoi(argv[1]);
    int i,j = 0;
    srand(time()NULL);
    res_t* tem= res_first;
    for(i = 0; i < no_of_mutants; i++)
    {      

       for(j = 0; i < NB_TYPE; i++)
       {             
         tem->popultaion[j] = rand();
       }
       tem++
    }
    //...other code
  }

セグメンテーション エラーが発生します。gdb を使用してデバッグすると、ここにあるように見え、SIGSEGV を取得します。

      tem->popultaion[j] = rand();

2 つの質問があります。

  1. ポインターの追加を使用して配列を構築しようとするこの形式は有効ですか? アドレスが技術的に有効である必要がある場合でも、最初の実行でセグメンテーション違反が発生します。
  2. 構造体から配列メンバーにアクセスする方法は有効ですか? (確かにそうですが、確認したいだけです)?

PS私はmallocを認識しており、mallocを使用して同じことを達成できましたが、コードの他の場所を変更する前にこれが問題を引き起こしているかどうかを知りたいのですが、そうであればなぜですか?

4

2 に答える 2

3

ポインタの追加を使用して配列を構築しようとするこの形式は有効ですか?アドレスが技術的に有効であるはずなのに、最初の実行でセグメンテーション違反が発生しています。

なぜそれが必要ですか?なので、コードは未定義の動作NULLを呼び出します。ユーザーが配列内のアイテムの数を入力したときに、メモリを割り当てる必要があります。

res_first = malloc(sizeof(*res_first) * NUM_OF_ELEMENTS);

そしてもちろん、使用後にそれを解放します:

free(res_first);
于 2013-02-17T06:16:27.367 に答える
1

メモリを割り当てていないため、セグメンテーション違反が発生します。あなたres_firstはで初期化されていないNULLので、ランダムなものを指しています。malloc必要なサイズのヒープに配列を割り当てるために呼び出す必要があります。また、realloc後で再割り当てする必要があるかどうかも確認してください。

于 2013-02-17T06:14:34.277 に答える