0

この単純な配列の初期化で何が問題なのかわかりません。field[x][y] = ' ';プログラムは、0 の x および y でsegfault でクラッシュします (私は Code::Blocks デバッガーを使用します)。

/* init data structures */
char **field;
int field_width=5,field_height=5;
field = malloc(sizeof(char*)*field_width);
for(x=0;x<field_width;x++)
{
    field[x] = malloc(sizeof(char)*field_height);
    for(y=0;y<field_height;y++)
    {
        field[x][y] = ' ';
    }
}

私が間違っていることについて何か考えはありますか?

4

4 に答える 4

1
field = (char*) malloc(sizeof(char*)*field_width);

もしかしてchar*キャスト?

于 2012-10-12T23:15:51.807 に答える
1

実際にコード スニペットを単純化しました。field_width初期化されませんでした。ビルド中にこれが警告を発しなかったことに驚いています。x=0 のときに segfault が生成される理由がよくわかりません。

しかし、私の問題は解決しました。皆様、ご迷惑をお掛け致しますが、宜しくお願い致します...

于 2012-10-12T23:34:14.110 に答える
0

これでいいのではないですか?

field = (char**)malloc(sizeof(char*)*field_width);

編集

mallocnull を返す可能性があるためfield[x] = malloc(sizeof(char)*field_height);、メモリ ブロックが有効であることを確認する必要があります。

于 2012-10-12T23:21:20.070 に答える
0

を初期化する前にfield_width、ランダム データが含まれていた可能性があります。ステートメントで使用field_widthすると、未定義の動作がトリガーされます。コンパイラは、 をスキップしたり、たまたま に格納されていたガベージを使用したり、さらに悪い/見知らぬものを使用したりするなど、必要に応じて何でも実行できます。いずれにしても、必要な呼び出しが得られる可能性は低く、実行されなかったり返されたりした場合 (たとえば、大きすぎて編集できない値が含まれている場合) の結果の値が有効なメモリを指している可能性は低くなります。これにより、ループ内で逆参照するときに segfault が発生します。何かが間違っているという明確な兆候が得られたのは幸運でした。メモリ エラーは必ずしもそれほど露骨ではありません。mallocmallocfield_widthmallocNULLfield_widthmallocfieldfield

于 2012-10-13T02:38:41.227 に答える