【发布时间】:2014-12-09 01:48:38
【问题描述】:
我已经运行了以下程序:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
int main()
{
char *p, *q;
p = (char*)malloc(1);
q = (char*)malloc(25);
strcpy(p, "abcd");
strcpy(q,"efgh");
strcat(p,q);
printf("%s",p);
return 0;
}
我期待它会给出错误“分段错误”。而是将输出打印为:
abcdefgh
我不知道它是如何工作的,因为 p 只分配了 1 个字节,而我们正在复制一个占用更多空间的字符串。这是正确的行为吗?
OS: windows 7
Compiler: mingw C compiler
【问题讨论】:
-
这叫做未定义行为...
-
如果字符串较长,它确实会崩溃。
-
写入数组的边界不一定会导致分段错误。很多事情都可能发生,这就是为什么它是未定义的行为。可能您的
malloc导致一个足够大的块包含"abcd"加上终止零,这就是它起作用的原因。但这不能保证。如上所述,这是未定义的行为。 -
@Jongware:不一定。它可能会导致堆损坏,但如果初始堆足够大,则不必崩溃。通常,写入属于进程的内存不会导致崩溃,只会导致损坏。
-
@Rudy:你可能是对的。不幸的是,我弹出了那个毫无价值的 Windows“正在检查解决方案..”对话框,它没有说明确切的错误是什么......(它似乎也永远find解决方案。)跨度>
标签: c segmentation-fault strcpy