memcpy使用指针抛出访问冲突

时间:2014-03-15 16:15:16

标签: c

我有一个关于memcopy的非常简单的问题,我已经能够修复但不明白为什么。以下代码在runtuime崩溃时出现“访问冲突”:

char *src = "HELLO WORLD!";
char * dest = "hello world!";
memcpy(dest, src, strlen(src)+1);

dest似乎足够大了,据我所知,memcpy应该盲目地复制字节,所以我不明白这个问题。

将dest更改为数组,例如char dest[13];修复了一些问题,因此要求dest必须是未初始化的内存并创建数组才能为您执行此操作,而指针声明不会这样做吗?

干杯

3 个答案:

答案 0 :(得分:12)

当你这样做时:

char *dest = "hello world!";

"hello world!"保存在内存的只读部分,并且指向名为dest的指针指向它,使得对此内存的任何写入操作都是非法的。因此,如果您尝试将其用作memcpy中的目的地;它是一种访问冲突。

您应该使用:

char dest[] = "hello world!";

答案 1 :(得分:3)

字符串文字" ...",当用于初始化字符指针时,类型为const char *,即它是只读的。

因此,

dest应该具有类型const char *,此时您的代码将无法编译。

如果您打开所有编译器警告,那么您将收到" char * dest = ..."的警告。线。

答案 2 :(得分:1)

char dest [] =“你好世界!”和char * dest =“你好世界!”不是一回事。 char dest [] =“你好世界!”是一个包含13个元素的数组(该字符串以空值终止)。 char * dest =“你好世界!”是一个指向常量空终止字符串(也是13个字符)的指针。