:
char* realtor_command[120];
for(int i=0;i<REALTOR_MAX_COMMAND_LENGTH;i++){
realtor_command[i]=malloc(sizeof(120));
}
あなたは120個の文字列の配列を作成し、次いでREALTOR_MAX_COMMAND
ストリングをループ(おそらくこれは120でなければなりませんか?)、新たに割り当てられた4バイトまたは8バイトの文字列(sizeof(120)
はsizeof(int)
を意味し、4バイトまたは8バイトのいずれかです)に設定します。これらの文字列は新たに割り当てられるため、任意のデータが含まれ、ヌルターミネータで終了することはできません。
strlen()
は、ヌルターミネータが見つかるまで文字列をループするだけなので、ヌルターミネータ以外の文字列は使用できないため、これは重要です。
あなた自身でヌルターミネータを追加することはできますが、文字列には文字列の末尾まで任意のガーベッジが含まれ、ヌルターミネータが内部に含まれる可能性があります。あなたは彼らがNULL終止符を開始させることができたが、その後strlen()
は常に良いかもしれない何
0は、あなたが実際にそれらを埋める際にこれらの文字列を割り当てることで戻ってくる、それまでにnullポインタを置いておく:
char* realtor_command[120];
for (int i = 0; i < 120; i++) {
realtor_command[i] = NULL;
}
char input_buffer[REALTOR_MAX_COMMAND];
// Read in one string, then copy it so we can re-use the buffer
fgets(input_buffer, REALTOR_MAX_COMMAND, stdin);
realtor_command[0] = strdup(input_buffer);
これにより、コード内のメモリリークも回避されます。あなたはおそらく、あなたのバッファに必ず入力フィットを作るために、fgets
で読み取り、文字列が改行が含まれていることを確認したいと思うことを
注:
if (strstr(input_buffer, "\n") == NULL) {
// error, input didn't fit in our buffer!
}
が一緒に、あなたは 'strlen'を呼び出す方法をしてください表示間違った値で – Downvoter
「sizeof(120)」は何ですか?あなたは120バイトよりもずっと少ないメモリを割り当てています。 – ForceBru
これはsizeof(int)(4または8)です。 –