c语言中的memcpy函数

c语言中的memcpy函数,c,linux,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”分配了8000字节。并且只将“t”复制到s,

为什么下面的代码会出现分段错误

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”分配了8000字节。并且只将“t”复制到s,直到7000字节。虽然我为“s”分配了8000字节,但为什么它会出现分段错误?

分段错误是因为
t
指向小于7000字节的区域。
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);
}
当没有可读页面被映射时,您可能正试图读入一个区域(在字符串literal
“在RedHat Linux上工作”
结尾之后)。
您应该将memcpy限制为
sizeof(“在RedHat Linux上工作”)
字节。

分段错误是因为
t
指向小于7000字节的区域。 当没有可读页面被映射时,您可能正试图读入一个区域(在字符串literal
“在RedHat Linux上工作”
结尾之后)。 您应该将memcpy限制为
sizeof(“在RedHat Linux上工作”)
字节。

使用:

memcpy(s, t, strlen(t) + 1);
避免
memcpy
读取字符串文本数组

C标准说明了关于字符串函数(
memcpy
string.h
函数)(C99,7.21.1p1)

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

使用:

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

C标准说明了关于字符串函数(
memcpy
string.h
函数)(C99,7.21.1p1)

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


您的程序表现出未定义的行为:要使memcpy()正常工作,源和目标都必须能够按照您指定的字节数寻址

您已满足目标,但不满足源部分


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

您的程序表现出未定义的行为:要使memcpy()正常工作,源和目标都必须能够按照您指定的字节数寻址

您已满足目标,但不满足源部分


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

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

您试图访问超出分配范围的内存。
因此,它给长度为24的字符串缓冲区指定了一个分段错误,但在memcpy中,您试图复制的长度超过了不存在的长度(7000)

您试图访问超出分配范围的内存。

因此它给出了一个分段错误

字符串的长度是23。字符串文字数组的大小是24。是的,正确,我指的是缓冲区的总长度,不是strlenHey-Sumit-Jain,我为s分配了8000字节的内存。但只复制到7000字节。那么,为什么它应该给出细分呢fault@NikhilTej:因为您读取的内容超过了缓冲区的结尾是,但这是目标,所以源只有24个字节,两者都必须大于等于要复制的字节数字符串的长度为23。字符串文字数组的大小是24。是的,正确,我指的是缓冲区的总长度,不是strlenHey-Sumit-Jain,我为s分配了8000字节的内存。但只复制到7000字节。那么,为什么它应该给出细分呢fault@NikhilTej:因为您读取的内容超过了缓冲区的结尾是的,但这是目的地,所以您的源只有24个字节,它们都必须大于要复制的字节数Hey Employed Russian,感谢您的回复。我无法得到“你已经满足了目的地,但不是源部分”的陈述。为什么我需要满足源代码部分?@NikhilTej:因为
t
的长度小于7000字节。@NikhilTej-你有24个字节,你要它复制7000字节。一旦它到达您实际拥有的24个字节的末尾,它就会进入未知(未定义)区域。您不知道字符串文字(
t
)的24个字节以外的内存中有什么内容。@NikhilTej您需要满足源代码部分的要求,因为
memcpy
要求您这样做(否则您会得到未定义的行为)。@Brian Roach-此外,您不知道在这24个字节之外是否可以访问内存。出现分段错误是因为
memcpy
试图访问不可访问的内存。嘿,谢谢你的回复。我无法得到“你已经满足了目的地,但不是源部分”的陈述。为什么我需要满足源代码部分?@NikhilTej:因为
t
的长度小于7000字节。@NikhilTej-你有24个字节,你要它复制7000字节。一旦它到达您实际拥有的24个字节的末尾,它就会进入未知(未定义)区域。您不知道字符串文字(
t
)的24个字节以外的内存中有什么内容。@NikhilTej您需要满足源代码部分的要求,因为
memcpy
要求您这样做(否则您会得到未定义的行为)。@Brian Roach-此外,您不知道在这24个字节之外是否可以访问内存。出现分段错误的原因是
memcpy
试图访问不可访问的内存。您还可以查看
strcpy
strncpy
进行字符串复制。您还可以查看
strcpy
strncpy
进行字符串复制。