我在写一个程序,我必须把两个重叠的字符串复制到另一个.环顾四周,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是seg故障背后的原因之外,我不知道它到底说了什么.

我在这里做错了什么?

推荐答案

您正在try 修改不允许的字符串文字.这样的字符串是只读的,实际上通常驻留在内存的只读部分中.这就是消息"映射区域的权限不正确"告诉您的.

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

char s[10] = "foobar"; 

C++相关问答推荐

如何将一个enum类型类型转换为另一个类型?

为指针 struct 创建宏

segfault在C中使用getline()函数

C/SDL程序,渲染不使用我的渲染器

*p[num]和(*p)num的区别

为什么输出不是从上到下C

为什么STM32G474RE上没有启用RCC PLL

在列表中插入Int指针(C)

致命:ThreadSaniizer:在Linux内核6.6+上运行时意外的内存映射

预先分配虚拟地址空间的区域

当b是无符号字符时,int a=(b<;<;2)>;>;2;和int a=b&;0x3F;之间有什么区别?

当内存来自Malloc时,将char*转换为另一个指针类型是否违反了严格的别名规则?

是否定义了此函数的行为?

pthread_create的用法

C语言中奇怪的输出打印数组

如何读取程序中嵌入的数据S自己的ELF?

如何修复我的qsort()算法?它每次都给出不同的结果

将复合文字数组用作临时字符串缓冲区是否合理?

程序如何解释变量中的值

将字节/字符序列写入标准输出的最简单形式