为什么C语言函数传参后可修改arr[0]却无法修改ptr[0]?
#include <stdio.h> void dosmth(char* ptr, char* arr); int main() { char* ptr = "hello"; char arr[] = "jumbo"; dosmth(ptr, arr); return 0; } void dosmth(char* ptr, char* arr) { arr[0] = 'J'; ptr[0] = 'H'; //注释该行代码程序可正常运行 printf("%s\n", arr); printf("%s\n", ptr); }
问题解答
指针能否修改指向的内容,和指针本身的来源无关,只和它指向的内存区域的读写权限有关,二者的差异本质是指向的内存段权限不同:
char* ptr = "hello"中,ptr指向的是存放在只读数据段的字符串字面量,该区域权限为只读,不管这个指针被传递到哪个函数、做过什么类型转换,只要尝试写入该地址都会触发非法内存访问错误。char arr[] = "jumbo"中,arr对应的是栈上开辟的可读写内存空间,代码会把字符串字面量"jumbo"的内容拷贝到这块栈内存中。当数组作为参数传入函数衰变为指针后,这个指针仍然指向原来的可读写栈内存,所以通过该指针修改内容是合法操作。
内容的提问来源于stack exchange,提问作者D-I-S-C
相关产品推荐
相关产品推荐

