char buffer[10];
strcat(buffer, "hi");
printf("%s", buffer);
在上面的代码中,它打印了一些奇怪的符号或数字,后跟“hi”,我知道 strcat 正在附加到缓冲区。我通常将缓冲区中的内存归零。但我很好奇为什么我通常必须这样做。
如果我printf("%i", buffer);
不使用 strcat,它只会打印一个随机数。那个号码是多少?在我用任何东西填充之前,任何人都可以解释或链接到解释缓冲区中内容的 tut 吗?
“缓冲区”是堆栈上的一个 10 字节区域,它包含最后写入该内存区域的任何内容。当您使用 strcat 时,它将在该区域中的第一个空字节之后连接“hi”(因此,如果第一个空字节超过 10 个字节,您将覆盖堆栈上的某些内容)。当您在不归零的情况下打印时,它会打印字节,直到第一个 0(空)。同样,这可能会打印超过 10 个字节。
当您 printf (%I, buffer) 时,您打印该位置的地址。
首先,您需要对缓冲区进行零初始化:
char buffer[10] = {0};
buffer[0] = 0; /* As R.. points out, initializing all elements is excessive. */
其次,数字是 的地址buffer
,为十进制。如果你真的想打印,你最好打印:
printf("%p\n", buffer);
您需要一个终止 '\0' 来标记字符串的结尾,使用
strcpy(buffer,"hi");
strcat() 尝试附加到假定为 '\0' 终止的现有字符串。您的缓冲区未初始化。
在memset(buffer, 0, 10)
追加之前先将内存归零。
strcat() 函数将 src 字符串附加到 dest 字符串,覆盖 dest 末尾的空字节 ('\0'),然后添加终止空字节。字符串不能重叠,并且目标字符串必须有足够的空间用于结果。
buffer
没有'\0'
终止,因为它没有初始化,我们不知道它包含什么。因此,这是一种未定义的行为。您应该首先确保缓冲区是 '\0' 终止的。
并且打印的数字不是随机数,而是缓冲区的起始地址。