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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:44:16