0

malloc を使用して 2D 文字配列を作成し、その値を '\0' に割り当てようとしました。

char **predicate_array = malloc(no_of_lines_in_data_map);
for(int i = 0; i < no_of_lines_in_data_map; i++){
    predicate_array[i] = malloc(1024 * sizeof(char));
    predicate_array[i][0] = '\0';
}

ただし、出力を印刷すると、次のようになります。

predicate_array[0] = (P;

predicate_array[1] = 

predicate_array[2] = 

predicate_array[3] = 

predicate_array[4] = 

predicate_array[5] = 

predicate_array[6] = 

...

...

最初の配列が「\ 0」に設定されていない理由を誰かが知っていますか?

ありがとうございました。

4

2 に答える 2

3

最初の malloc のパラメーターが 2 次元配列に適合しません。

以下のように修正します

char **predicate_array = (char **)malloc(no_of_lines_in_data_map*sizeof(char *));
于 2013-05-17T03:06:34.040 に答える
1

これが私が危険にさらすことができる唯一の推測です。no_of_lines_in_data_map が 7 に設定されている場合 (表示している出力に基づいて推測しています)、8 バイトのポインターを備えた 64 ビット プラットフォームを使用している場合、1 つのポインターに対しても十分なスペースが割り当てられていません。ポインターバイトの 7 * サイズではなく、7 バイトを割り当てました。

最初のmallocを割り当てようとすると、プログラムがクラッシュする可能性がありますが、システムとそのメモリがプロセスに割り当てられているかどうかによっては、クラッシュする必要はありません。そのため、結果のポインターを malloc して配列の最初の要素に割り当てると、期待した 7 バイトに割り当てられますが、プログラムの別の部分が所有する他の 1 バイトが割り当てられます。このメモリアドレスを空の文字列に設定している間、ポインタが指しているメモリ位置にデータを出力する前に、プログラムの他の部分がポインタの最後のバイトを変更し、別のメモリ位置に送信する可能性があります。ステートメントを印刷します。

これをテストするには、no_of_lines_in_data_map を 8 以上に設定し (他に何も修正せずに)、出力の最初のビットが正しくなるかどうかを確認します (ただし、プログラムはまだ壊れているため、クラッシュするか、別の場所で不正なデータが返されることを期待する必要があります)。

永久に修正するには、vvy が提案したことを実行します (malloc をキャストしないことを除く)。

また、私の衒学者は、メモリが連続していないため、2D 配列を実際に割り当てているわけではないと言いたいと思っています。配列のリストを指す配列を実際に割り当てていますが、それらはいたるところに広がっています。

于 2013-05-17T03:52:01.887 に答える