我运行了以下程序:
#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;
}
我原以为它会给出错误&#34;分段错误&#34;。但相反,它将输出打印为:
abcdefgh
我不知道它是如何工作的,因为p只分配了1个字节,我们正在复制一个占用更多空间的字符串。这是正确的行为吗?
OS: windows 7
Compiler: mingw C compiler
答案 0 :(得分:-1)
当你使用malloc分配1个字节的内存时,malloc实际上做的是它从内核请求大约134k字节的内存并给变量1个字节并保留休息以备将来用作保留,这样当你下次从保护区获得地址时你会做一个malloc。保留区中的所有地址都是有效的,因此您不会遇到任何段错误。 如果你检查p和q的地址,你就会明白它为什么要打印。