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

在上面的代码中,它打印了一些奇怪的符号或数字,后跟“hi”,我知道 strcat 正在附加到缓冲区。我通常将缓冲区中的内存归零。但我很好奇为什么我通常必须这样做。

如果我printf("%i", buffer);不使用 strcat,它只会打印一个随机数。那个号码是多少?在我用任何东西填充之前,任何人都可以解释或链接到解释缓冲区中内容的 tut 吗?

4

5 回答 5

4

“缓冲区”是堆栈上的一个 10 字节区域,它包含最后写入该内存区域的任何内容。当您使用 strcat 时,它将在该区域中的第一个空字节之后连接“hi”(因此,如果第一个空字节超过 10 个字节,您将覆盖堆栈上的某些内容)。当您在不归零的情况下打印时,它会打印字节,直到第一个 0(空)。同样,这可能会打印超过 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. */

其次,数字是 的地址buffer,为十进制。如果你真的想打印,你最好打印:

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)追加之前先将内存归零。

于 2011-08-22T16:42:30.807 回答
0

strcat() 函数将 src 字符串附加到 dest 字符串,覆盖 dest 末尾的空字节 ('\0'),然后添加终止空字节。字符串不能重叠,并且目标字符串必须有足够的空间用于结果。

buffer没有'\0'终止,因为它没有初始化,我们不知道它包含什么。因此,这是一种未定义的行为。您应该首先确保缓冲区是 '\0' 终止的。

并且打印的数字不是随机数,而是缓冲区的起始地址。

于 2011-08-22T16:42:56.157 回答