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

