为什么以下代码会出现分段错误?
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个字节,为什么它会给出分段错误?
答案 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标准说关于字符串函数(memcpy
是string.h
函数)(C99,7.21.1p1)。
“如果在对象末尾之外访问数组,则行为为 未定义“。
答案 3 :(得分:1)
指向长度为24的字符串缓冲区,但在memcpy中,您尝试复制的不存在(7000)不存在。
您正在尝试访问超出分配内存的内存。 所以它给出了分段错误