修改数组元素是否会复制数据?C语言全局字符串数组操作疑问
结论
arr[0] = "something" 这个操作不会进行任何字符串数据复制,也不会对原arr[0]指向的内容生成拷贝。
原理说明
你定义的arr本质是一个存储char*类型指针的数组,数组里每个元素存的都不是字符串本身,而是字符串字面量的内存首地址:
- 初始化阶段的
"abc"、"def"、"gh"都是字符串字面量,会被编译器存储在程序的只读数据段(.rodata),初始化arr时只是把这些字面量的首地址依次写入arr的对应元素中,不会把字符串内容复制到arr的存储空间里。 - 执行
arr[0] = "something"时:- 新的字符串字面量
"something"同样会被提前存放在只读数据段,编译器会为它分配对应的内存地址 - 赋值操作仅仅是把这个新的地址值,覆盖掉
arr[0]原来存储的"abc"的地址,全程没有对任何字符串的内容进行拷贝操作 - 原来的
"abc"依然完整存在于只读数据段中,只是arr[0]不再指向它而已。
- 新的字符串字面量
通俗类比:你可以把
arr数组理解为一个存储门牌号的记事本:原来第一页写的是字符串"abc"所在的内存房间号,赋值操作只是把第一页的门牌号改成了"something"所在的房间号,全程没有移动或复制任何房间里的实际内容,原来的"abc"也还在原来的房间里没有变化。
易混淆点说明
如果你是调用strcpy(arr[0], "something")才会发生字符串内容的复制,但这种写法是非法的:因为arr[0]原本指向只读数据段的内存,写入该区域会触发段错误。你当前直接修改指针值的操作是完全合法的,因为arr本身是可写的全局指针数组,修改它存储的地址值没有任何问题。
内容的提问来源于stack exchange,提问作者NbNb
相关产品推荐
相关产品推荐

