1

次の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:?

どう思いますか?前もって感謝します...

4

1 に答える 1

2

正解は2と5です。

#2メモリ割り当て関数が失敗する可能性があり、戻り値を確認する必要があるためです。

#5関数が返されたバッファーを動的に割り当てるという事実を文書化しない限り、呼び出し元は返されたバッファーを解放する必要があることを認識できないためです。

#1あなたが正しく言ったようにcalloc、文字列に必要なメモリ+NULL終了に必要な余分なバイトを割り当てるため、正しくありません。

#3正しくないため不正解memcpyです。ソースから宛先にデータをコピーするだけです。そのメモリに格納されている内容には影響されません。

#4calloc割り当てられたメモリをゼロにするため、不正解です。

于 2013-01-11T14:25:37.670 に答える