我正在编写一个程序,我必须将两个重叠的字符串复制到另一个中。环顾四周后,
memmove
似乎是我完成任务所需要的。然而,它似乎并不像我从阅读手册页中看到的那样工作。
我编写了以下代码进行测试:
#include <stdio.h>
#include <string.h>
int main () {
char* s = "foobar"; // 7 bytes
memmove(s, s+1, 6);
printf("%s\n", s);
return 0;
}
我预计应该打印
oobar
,但是,我在执行时遇到了分段错误。如果我为第三个参数指定小于 6,情况也是如此。
运行 valgrind,它说
==36627== Bad permissions for mapped region at address 0x10A004
==36627== at 0x4852A13: memmove (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==36627== by 0x10917B: main (in /home/[..]/tmp)
这是我一生中第二次使用 valgrind,所以除了
memmove
是段错误背后的原因之外,我无法真正说出它在说什么。
我在这里做错了什么?
您正在尝试修改不允许的字符串文字。此类字符串是只读的,并且实际上通常驻留在存储器的只读部分中。这就是“映射区域的权限错误”消息告诉您的内容。
将
s
从字符串文字指针更改为数组,并确保为移动的字符串留出空间:
char s[10] = "foobar";