You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何在C语言中仅能对动态分配的参数产生副作用?

C中字符串内存修改权限差异解析

我们先定义一个用于产生内存修改副作用的函数:

void sideEffect(char *str) {
  str++;
  *str = 'X';
}

为什么动态分配内存的字符串可以被修改?

看以下示例代码:

int main(int argc, char **argv) {
  char *test = malloc(4 * sizeof(char));
  strcpy(test, "abc");
  printf("before: %s\n", test); // before: abc
  sideEffect(test);
  printf("after: %s\n", test); // after: aXc
  free(test);
}

通过malloc申请的内存属于堆内存区域,这是程序运行时向系统申请的可读写内存空间,程序对这块内存拥有完整的读写权限,因此可以通过指针修改其中的内容,不会触发内存访问错误。

为什么字符串字面量不能被修改?

看以下示例代码:

int main(int argc, char **argv) {
  char *test = "abc";
  printf("before: %s\n", test); // before: abc
  sideEffect(test); // 触发段错误 :(
  printf("after: %s\n", test);
}

这里的"abc"是字符串字面量,编译器会将其存储到程序的**只读数据段(.rodata)**中,操作系统会把这块内存标记为只读属性。当代码试图通过指针修改只读区域的内容时,会违反内存访问权限,直接触发段错误(Segmentation Fault)。


内容的提问来源于stack exchange,提问作者sueszli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 07:41:36