【发布时间】:2013-08-21 08:19:12
【问题描述】:
我昨天开始学习C,所以这可能是一个微不足道的问题,但我还是不明白。
假设我有以下代码:
#include <stdio.h>
#include <string.h>
int main()
{
char text[8];
strcpy(text, "Lorem ");
puts(text);
strcat(text, "ipsum!");
puts(text);
return 0;
}
这将在连接字符串时(或之后)导致分段错误。但是,如果我将 text 的大小从 8 更改为 9,则不会。
如果我错了,请纠正我,但这是我认为正确的:
“Lorem” - 大小 6(或带有 \0 的 7)
“伊普苏姆!” - 6 号(或带有 \0 的 7 号)
“Lorem ipsum!” - 12 号(或 13 号带 \0)
那么,8/9 来自哪里?这是strcat的执行造成的吗?还是有类似最小数组长度的东西?还是我犯了一个愚蠢的初学者错误?
提前致谢。
【问题讨论】:
-
在 Valgrind (valgrind.org) 下运行这个,你会发现两种情况都有问题。
-
对于您的问题“8/9 来自哪里”的答案,您的特定编译器完全有可能以 8 个字节的块分配内存。所以 text[8] 将分配 8 个字节; text[9] 将四舍五入到 16 个字节。当然这是依赖于实现的,你不应该指望编译器总是这样做!
标签: c segmentation-fault strcat