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

C语言字符指针数组内存布局疑问:为何每个元素后存在3个零字节?

C语言字符指针数组内存布局疑问:为何每个元素后存在3个零字节?

嗨,我来帮你理清楚这个问题!首先得把两个核心概念拆开:指针数组本身的内存和字符串字面量的内存,你大概率是在这里产生了混淆。

先看你的代码:

int main() { 
    const char* arr[4]; 
    arr[0] = "1000"; 
    arr[1] = "2000"; 
    arr[2] = "3000"; 
    arr[3] = "4000"; 
}

这里的arr是一个指针数组,它的每个元素都是const char*类型的指针——也就是说,数组里存的不是字符串本身,而是指向字符串字面量(比如"1000")起始地址的指针。

现在来说你看到的“每个元素后3个零字节”:
这几乎肯定是你对指针内存存储方式的误解。举个实际例子:
如果你的系统是32位的,const char*指针的大小是4字节。假设某个字符串"1000"存在内存地址0x00401000,那arr[0]里存的就是这个地址值。在小端字节序的系统(绝大多数常用系统都是)里,这个4字节的地址会被拆分成字节存储为00 10 40 00——也就是低字节在前。

如果你是逐字节查看内存的话,可能会误以为第一个字节是arr[0]的全部内容,后面三个零是额外的填充,但实际上这四个字节合起来才是完整的指针值,根本不存在“元素后的零字节”。

然后你问的“数组是不是连续的”——答案是肯定的!指针数组的每个元素在内存里是连续排布的,没有额外的间隙。比如32位系统中,arr[0]占地址0x00到0x03,arr[1]紧接着占0x04到0x07,以此类推,完全连续。

额外补充一句:那些字符串字面量("1000"之类的)是存在只读数据段的,每个确实占5字节(4个字符加结束符\0),但它们的内存区域和指针数组arr是完全分开的,arr里的指针只是指向它们的起始位置而已。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 10:44:50