【问题标题】:C code crashes from memmoveC 代码从 memmove 崩溃
【发布时间】:2012-03-16 10:12:29
【问题描述】:

我的代码在我写的时候没有崩溃:

char s[44] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
memmove(s, "asdf", 5);

但是当我写的时候它确实如此:

char* s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
memmove(s, "asdf", 5);

有人知道为什么吗?

【问题讨论】:

  • 您遇到分段错误了吗?你是用 gcc 编译的吗?
  • 尝试修改字符串文字是未定义的行为。在您的情况下,显然,UB 会使您的程序崩溃;在另一台计算机上,它可能会更改字符串文字的内容;在另一台计算机上,它可能会使柠檬汁从 USB 端口渗出。

标签: c memmove


【解决方案1】:

第一个分配空间并将a放入

第二个是指向常量内存的指针,你不能改变它。

【讨论】:

    【解决方案2】:

    在第一种情况下,堆栈上分配了 44 个字节,并将字符串“aa..a”复制到该空间。但在第二个空格中,字符串“aa..a”是一个常量值,存储在只读数据段中。所以当你尝试写一个只读的内存地址时会发生页面错误。

    【讨论】:

    • @OliCharlesworth:是的,更具体地说,UNIX 中的 SIGSEGV 信号
    【解决方案3】:

    char* s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

    存储在只读存储器中的字符串常量“aaaa”。例如,在 elf 可执行文件中,它们将存储在不可写的 .rodata 部分中。因此,当您尝试在这样的位置写入时,会导致错误he

    另一方面,char s[] 会将字符串存储在本地堆栈区域中,您可以对其进行修改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      相关资源
      最近更新 更多