使用 memmove 处理重叠字符串[重复]

问题描述 投票:0回答:1

我正在编写一个程序,我必须将两个重叠的字符串复制到另一个中。环顾四周后,

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
是段错误背后的原因之外,我无法真正说出它在说什么。

我在这里做错了什么?

c string substring valgrind memmove
1个回答
0
投票

您正在尝试修改不允许的字符串文字。此类字符串是只读的,并且实际上通常驻留在存储器的只读部分中。这就是“映射区域的权限错误”消息告诉您的内容。

s
从字符串文字指针更改为数组,并确保为移动的字符串留出空间:

char s[10] = "foobar"; 
© www.soinside.com 2019 - 2024. All rights reserved.