0

C プログラミングでは、文字バッファーは文字列の実装に使用されます。習慣的に、スコープ内の文字バッファーを使用する前にコンテンツをクリアします。char バッファーが同じスコープ内で複数回使用されている場合、char バッファーのクリーニングについて明確にする必要があります。たとえば、以下の関数内では、char buffer[BUF_SIZE] を使用しています。

void function foo(char *p_char)
{
 char buffer[BUF_SIZE];
 memset(buffer, '\0', BUV_SIZE-1);
 strcpy(buffer, p_char);
 ..
 ..
 // after some codes.
 strcpy(buffer, "second time use of buffer");

}

上記の関数では、 buffer が 2 回使用されます。2 番目の場所で memset() を呼び出して、 buffer 内の前のコンテンツを消去する必要がありますか? 同様に、char バッファを使用する場合、値を割り当てる前に常にクリアしますか (値が同じスコープ内のバッファに複数回割り当てられている場合)。

4

2 に答える 2

1

バッファを null 文字に設定しない場合、null ターミネータの後の文字はゴミになる可能性がありますが、何かが char * 文字列を読み取るとき、通常は null ターミネータで停止するため、通常は問題になりません。

于 2013-03-28T02:19:44.627 に答える
1

を使用している場合strcpymemset実際には必要ありません。ページから、次のman strcpyことがわかります。

strcpy() 関数は、src が指す文字列を、終端のヌル バイト ('\0')を含めて、dest が指すバッファにコピーします。文字列は重複してはならず、宛先文字列 dest はコピーを受け取るのに十分な大きさでなければなりません。

もコピーされるため、\0実際には を実行する必要はありません。memset同様にstrings、終了NULL \0文字はstring.

: を使用する予定がある場合はstrncpy、次の質問を参照してください: strncpy が null で終了しないのはなぜですか?

于 2013-03-28T02:20:33.753 に答える