C语言中结构体数组的内存布局及指针偏移问题
结构体数组的内存存储与指针运算解析
嘿,这个问题问到点子上了!咱们一步步拆解清楚:
核心结论先给你
barray + 1的结果是1006,你的结构体数组是100个struct b实例连续存放的,数组索引递增会直接跳转到下一个结构体的起始地址。
详细解释
1. 结构体数组的内存布局
你定义的b barray[100];是一个结构体实例数组,不是指针数组。它的内存布局是:
- 第一个结构体
barray[0]从地址1000开始,占据6字节(题目里明确struct b占6字节),地址范围是1000 ~ 1005 - 第二个结构体
barray[1]紧接着barray[0]的末尾,从地址1006开始,同样占6字节,以此类推 - 100个结构体连续排列,中间没有额外空隙(题目已给出结构体大小,无需考虑内存对齐的额外 padding)
2. 指针运算的规则
当你使用barray时,它会隐式转换成指向第一个元素的指针,也就是struct b *类型的指针(注意不是int *或void *)。
C语言里的指针运算,偏移量由指针指向的数据类型的大小决定,而非指针本身的大小:
- 对于
struct b *类型的指针,+1操作会自动加上sizeof(struct b)的字节数,也就是6 - 所以
barray + 1等价于&barray[0] + 1,结果就是1000 + 6 = 1006
3. 和指针数组的区别
如果是定义成指针数组:
struct b *barray[100];
那这才是由100个指向struct b的指针组成的数组,每个指针占4字节(题目里指针大小为4字节)。这时候barray + 1才会是1000 + 4 = 1004,但你的代码显然不是这种情况。
一句话总结
结构体数组是把一个个结构体“实打实”连续存在内存里,指针运算会自动帮你算出下一个结构体的起始地址,不用自己手动算字节数~
内容的提问来源于stack exchange,提问作者Milind
相关产品推荐
相关产品推荐

