次のCパズルの質問について考え直します。Cプログラマーがこれ以上の経験をどのように考えているのか興味があります...サンプルコードを見てください。
char * strdup (const char * s) {
char * buf;
int len;
assert(s != NULL);
len = strlen(s);
buf = (char *) calloc(len + 1, sizeof(char));
memcpy(buf, s, len);
return buf;
}
上記のstrdup()の提案された実装には、各呼び出しで一貫して表示されない可能性のあるランタイムエラーが含まれています。次のうち、このエラーを正確に説明しているのはどれですか?
これに対する考えられる答えは次のとおりです。
1 calloc()の引数により、sの内容を格納するために十分なメモリが割り当てられません。
2メモリが不足している場合、calloc()は失敗し、NULLを返す可能性があります。コードはこの状態を予期していません。
3 memcpy()を使用してASCII文字列をコピーすると、データが破損する可能性があります。
4 bufはNULで終了することはないため、文字列に影響を与えるCライブラリ関数では使用できません。
5この関数は、動的メモリへのポインタを返します。この方法は避ける必要があり、常にメモリリークを構成します。
私が思ったのは、正解は2ですが、答え2がすぐに正しいというよりも、他の答えが間違っているように見えるからです。
callocは文字列を適切に終了するのに十分なメモリ(len + 1)を予約しているため、回答1は正しくないようです。
回答3に書かれていることについては何も知りません。
answer4:memcpyはsの内容をbufにコピーし、最後のバイトを0に残します(lenバイトをコピーします。callocへの以前の呼び出しは最後のバイトを0で埋めたことに注意してください)。したがって、この答えは正しくありません、
答え5:?
どう思いますか?前もって感謝します...