strcpy函数行为

时间:2014-10-14 09:58:35

标签: c segmentation-fault strcpy

我运行了以下程序:

#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

1 个答案:

答案 0 :(得分:-1)

当你使用malloc分配1个字节的内存时,malloc实际上做的是它从内核请求大约134k字节的内存并给变量1个字节并保留休息以备将来用作保留,这样当你下次从保护区获得地址时你会做一个malloc。保留区中的所有地址都是有效的,因此您不会遇到任何段错误。 如果你检查p和q的地址,你就会明白它为什么要打印。