静态C字符串分配问题

Ann*_*mus 4 c string memory-management

请考虑以下代码:

char* str = "Hello World";
memcpy(str, "Copy\0", 5);
Run Code Online (Sandbox Code Playgroud)

memcpy期间发生分段错误.但是,使用此代码:

char str[12];
memcpy(str, "Hello World\0", 12);
memcpy(str, "Copy\0", 5);
Run Code Online (Sandbox Code Playgroud)

该程序不会产生分段错误.

问题来自于在堆栈上分配内存而不是数据部分吗?

Mar*_*ers 11

在gcc中使用字符串文字时,该值将放在只读内存中,无法修改.试图修改它会导致未定义的行为.通常,当您尝试执行此操作时,您将在Linux上遇到分段错误.

第二个示例有效,因为您没有修改字符串文字,您正在修改存储在非只读变量中的副本.

  • +1 标准说 (6.4.5/6) “如果程序尝试修改这样的数组,则行为未定义。” 虽然没有提到只读内存(它很可能适用于 Linux 和 gcc) (2认同)
  • 在许多情况下,"未定义的行为"情况是那些需要硬件支持的情况.在这种情况下,它支持内存访问权限. (2认同)