memmove/memcpy不能拷贝到有值的dest中吗?

疑问是:

  1. memmove/memcpy不能拷贝到有值的dest中吗?
  2. 报错"SEGV on unknown address"为什么说是未知地址呢? src/dest已经有地址了啊。

如下代码:

  char* src = "abcde";
  char* dest = "12345";
  memmove(dest, src, 5);
  printf("%s\n", dest);

编译方式:
g++ -g -fsanitize=address -fno-omit-frame-pointer -fsanitize=leak 1.cpp

执行二进制文件报错:

ASAN:DEADLYSIGNAL
=================================================================
==23128==ERROR: AddressSanitizer: SEGV on unknown address 0x56540390b0c4 (pc 0x7fa77d13bad4 bp 0x7ffeb2ea83e0 sp 0x7ffeb2ea7b48 T0)
==23128==The signal is caused by a WRITE memory access.
    #0 0x7fa77d13bad3  (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xfcad3)
    #1 0x7fa77d0b9d1d in __interceptor_memmove (/usr/lib/x86_64-linux-gnu/libasan.so.4+0x7ad1d)
    #2 0x56540390ae1f in main /home/tom/work/test/excercise/1.cpp:28
    #3 0x7fa77c8e6c86 in __libc_start_main (/home/tom/work/tools/sensor_check/lib/libc.so.6+0x21c86)
    #4 0x56540390ad09 in _start (/home/tom/work/test/excercise/a.out+0xd09)

AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xfcad3)
==23128==ABORTING
阅读 2k
2 个回答
  1. 这个地址不可写。一般字符串字面量地址都是不可写的 (c++ 的话,需要用 const char*)
  2. 应该是因为这个地址即不在堆上也不在栈上。
双引号引用的单个或多个字符是一种特殊的字面量-字符串字面量,其存储在全局只读存储区【(一般为 flash 地址)不能进行写操作,否则会导致运行时错误】
char* dest = "12345";
  1. "12345" 是字符串字面量,存储在只读存储区,写时将导致运行时错误
  2. char* dest = "12345", dest 指向只读存储区地址
  3. memmove/memcpy 对只读存储区写操作,导致运行时错误
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题