我有一个关于memcopy的非常简单的问题,我已经能够修复但不明白为什么。以下代码在runtuime崩溃时出现“访问冲突”:
char *src = "HELLO WORLD!";
char * dest = "hello world!";
memcpy(dest, src, strlen(src)+1);
dest似乎足够大了,据我所知,memcpy应该盲目地复制字节,所以我不明白这个问题。
将dest更改为数组,例如char dest[13];
修复了一些问题,因此要求dest必须是未初始化的内存并创建数组才能为您执行此操作,而指针声明不会这样做吗?
干杯
答案 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个字符)的指针。