c中的memcpy函数

时间:2012-01-02 18:13:35

标签: c linux

为什么以下代码会出现分段错误?

int main()
{
        char *t = "Working on RedHat Linux";
        char *s;

        s = malloc (8000 * sizeof(char));
        memcpy(s,t,7000);  
        printf("s = %s\nt = %s\n",s,t);
        free(s);
}

我为's'分配了8000bytes。并且仅将't'复制到s直到7000字节。虽然我为's'分配了8000个字节,为什么它会给出分段错误?

4 个答案:

答案 0 :(得分:11)

分段错误是因为t指向小于7000字节的区域。 当没有映射可读页面时(在字符串文字"Working on RedHat Linux"结束之后),您可能正在尝试读入某个区域。 您应该将memcpy限制为sizeof("Working on RedHat Linux")字节。

答案 1 :(得分:4)

您的程序显示未定义的行为:要使memcpy()起作用, source destination 必须可以寻址您指定的字节数。< / p>

您已满足目的地,但不满足来源部分。

此外,您可以删除sizeof(char),因为标准定义的始终为1。

答案 2 :(得分:2)

使用:

memcpy(s, t, strlen(t) + 1);

避免memcpy读取字符串文字数组。

C标准说关于字符串函数(memcpystring.h函数)(C99,7.21.1p1)。

  

“如果在对象末尾之外访问数组,则行为为   未定义“。

答案 3 :(得分:1)

指向长度为24的字符串缓冲区,但在memcpy中,您尝试复制的不存在(7000)不存在。

您正在尝试访问超出分配内存的内存。 所以它给出了分段错误