【发布时间】:2011-07-20 15:13:17
【问题描述】:
我预计这段代码会出现段错误:
char * foo (char my_ascii[10])
{
strcpy (my_ascii, "0123456789");
return my_ascii;
}
char bar[2];
printf("%s\n", foo (bar));
因为 bar 在堆栈中保留了 2 个字符的数组,而 foo() 尝试写入 10 个字符。但是, printf() 写入标准输出 10 个字符并且不会发生错误。为什么会这样?
另外,如果我这样修改 foo() 函数:
char * foo (char my_ascii[1])
{
strcpy (my_ascii, "0123456789");
return my_ascii;
}
行为完全相同:将 10 个字符复制到 my_ascii。有什么解释吗?
非常感谢您。
【问题讨论】:
-
我不相信你可以在函数声明中分配内存(所以
char *func(char x[10])和char *func(char *x)是一样的 -
复制了 11 个字符,而不是 10 个! strcpy ever 会将终止的 '\0' 复制到目标 --> 未定义的行为。
标签: c arrays string overflow overrun