2
char buffer[10];
strcat(buffer, "hi");
printf("%s", buffer);

上記のコードでは、奇妙な記号または数字の後に「hi」が続きます。strcatがバッファに追加されていることがわかります。そして、私は通常、バッファ内のメモリをゼロにします。しかし、なぜ私は通常それをしなければならないのか興味があります。

printf("%i", buffer);strcatなしで実行すると、ランダムな数値が出力されます。その数は何ですか?私が何かでそれを埋める前に、誰かがバッファにあるものを説明するツタンカーメンを説明したりリンクしたりできますか?

4

5 に答える 5

4

「バッファ」はスタック上の10バイトの領域であり、そのメモリ領域に最後に書き込まれたものがすべて含まれます。strcatを実行すると、その領域の最初のnullバイトの後に「hi」が連結されます(したがって、最初のnullバイトが10バイトを超える場合は、スタック上の何かを上書きします)。ゼロ化せずに印刷すると、最初の0(null)までバイトが印刷されます。繰り返しますが、これは10バイトを超えて印刷される可能性があります。

printf(%I、buffer)を実行すると、その場所のアドレスが出力されます。

于 2011-08-22T16:41:05.160 に答える
3

まず、バッファをゼロ初期化する必要があります。

char buffer[10] = {0};
buffer[0] = 0; /* As R.. points out, initializing all elements is excessive. */

次に、数値はbuffer10進数としてののアドレスです。本当にそれを印刷したい場合は、印刷することをお勧めします。

printf("%p\n", buffer);
于 2011-08-22T16:40:38.867 に答える
2

文字列の終わりをマークするには、終了する「\0」が必要です。

strcpy(buffer,"hi");

strcat()は、「\0」で終了したと見なされる既存の文字列に追加しようとします。バッファが初期化されていません。

于 2011-08-22T16:41:26.860 に答える
1

memset(buffer, 0, 10)追加する前に、最初にメモリをゼロにするためにaを実行します。

于 2011-08-22T16:42:30.807 に答える
0

strcat()関数は、src文字列をdest文字列に追加し、destの最後にあるヌルバイト('\ 0')を上書きしてから、終了するヌルバイトを追加します。文字列は重複してはならず、dest文字列には結果を表示するのに十分なスペースが必要です。

buffer初期化されていないため'\0'、終了されません。何が含まれているのかわかりません。したがって、これは未定義の動作です。まず、バッファが「\0」で終了していることを確認する必要があります。

また、出力される番号はランダムな番号ではなく、バッファの開始アドレスです。

于 2011-08-22T16:42:56.157 に答える