为何在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
相关产品推荐
相关产品推荐

