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

修改数组元素是否会复制数据?C语言全局字符串数组操作疑问

结论

arr[0] = "something" 这个操作不会进行任何字符串数据复制,也不会对原arr[0]指向的内容生成拷贝。

原理说明

你定义的arr本质是一个存储char*类型指针的数组,数组里每个元素存的都不是字符串本身,而是字符串字面量的内存首地址:

  1. 初始化阶段的"abc"、"def"、"gh"都是字符串字面量,会被编译器存储在程序的只读数据段(.rodata),初始化arr时只是把这些字面量的首地址依次写入arr的对应元素中,不会把字符串内容复制到arr的存储空间里。
  2. 执行arr[0] = "something"时:
    • 新的字符串字面量"something"同样会被提前存放在只读数据段,编译器会为它分配对应的内存地址
    • 赋值操作仅仅是把这个新的地址值,覆盖掉arr[0]原来存储的"abc"的地址,全程没有对任何字符串的内容进行拷贝操作
    • 原来的"abc"依然完整存在于只读数据段中,只是arr[0]不再指向它而已。

通俗类比:你可以把arr数组理解为一个存储门牌号的记事本:原来第一页写的是字符串"abc"所在的内存房间号,赋值操作只是把第一页的门牌号改成了"something"所在的房间号,全程没有移动或复制任何房间里的实际内容,原来的"abc"也还在原来的房间里没有变化。

易混淆点说明

如果你是调用strcpy(arr[0], "something")才会发生字符串内容的复制,但这种写法是非法的:因为arr[0]原本指向只读数据段的内存,写入该区域会触发段错误。你当前直接修改指针值的操作是完全合法的,因为arr本身是可写的全局指针数组,修改它存储的地址值没有任何问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 01:09:01