Linux Kernel = 2.6.32-41-generic#94-Ubuntu
语言:C
代码段:
#include <stdio.h>
int main ()
{
char buf[5];
int index = 0;
for (index = 0; index < 5; index++ )
{
sprintf(buf,"sud_%d", index);
printf("for index = %d\n",index);
printf("buf = %s\n",buf);
}
return 0;
}
问题1:为什么上述代码片段在执行上述代码时进入循环?
问题2:sprintf是否要求目标缓冲区的最后一位填充0或'\ 0'?
如果我在上面的代码中使用缓冲区大小6(buf [6]),它可以正常工作。
任何人都可以告诉我这种行为的原因吗?
此致 Sudhansu
答案 0 :(得分:4)
因为未定义的行为。
输出缓冲区buf
只有5个字符大,但第一次调用sprintf()
将生成字符串"sud_0"
,由于终结符需要6个字符。然后它在buf
之外写入,触发未定义的行为。使用snprintf()
。
snprintf()
并非“要求”在您调用之前填充之前的任何字符,但它会确保将其设置为'\0'
电话完成后。这是因为它的目的是在给定的缓冲区中构建一个完整有效的C字符串,因此必须确保字符串被正确终止。
很难(有些人会说毫无意义)推理未定义的行为,但我怀疑发生的事情是写入buf
的第6个字符溢出到index
,将第一个字节写入0如果您使用的是小端系统,这与执行index &= ~255
相同。由于index
的值应该介于0和5之间,因此它会重置为0,这会导致循环继续运行。
答案 1 :(得分:3)
您正在编写外部声明的缓冲区。这是未定义的行为。
您的char buf[5];
太小了。由于'\0'
终结符,您需要至少6个字符“sud_0”。