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

C语言结构体数组点/箭头运算符使用及运行结果疑问

代码笔误修正

首先你给出的代码存在编译错误:C语言中获取类型大小的运算符是全小写的sizeof,你写的sizeOf无法通过编译,需要先修正。

问题1:结构体数组的实际内存结构

你通过malloc申请的是一块连续的堆内存,总大小为5 * sizeof(Point),内存布局和栈上声明的Point arr[5]完全一致:

  • 内存起始地址就是指针arr存储的地址,对应第0个结构体元素arr[0]
  • 每个Point结构体占8字节(假设int为4字节),前4字节存储成员x,后4字节存储成员y
  • 5个结构体完全连续排列,无额外元数据或空隙(不考虑编译器结构体对齐的特殊配置)
问题2:下标+点运算符访问成员的逻辑

C语言中arr[ind]是*(arr + ind)的语法糖,整个操作分为两步:

  1. 指针偏移:arr是Point*类型,做加法时会自动按Point的大小做步长偏移,arr + ind就指向第ind个结构体的起始地址
  2. 解引用后得到Point类型的结构体实例,不是指针,所以用点运算符.直接读写该实例对应成员的内存值
    你也可以用指针语法写等价操作:(arr + ind)->x和arr[ind].x的执行效果完全相同。
问题3:打印结果为0的原因

这个问题和循环变量ind的最终值没有关系,问题出在你打印时的指针指向:

  • 循环逻辑是ind从0到4依次给5个元素赋值,arr[0].x为0,arr[4].x为4,循环终止时ind的实际值是5(不满足ind < 5才跳出)
  • 后续代码中Point * pptr = arr;直接把数组的起始地址赋值给了pptr,也就是pptr指向第0个元素
  • pptr->x就是取第0个元素的x值,结果自然是0
    如果要打印下标为4的元素的x值,可以用以下任意一种写法:
// 下标访问
printf("x = %d\n", arr[4].x);
// 指针偏移+箭头运算符
printf("x = %d\n", (pptr + 4)->x);
// 指针偏移解引用+点运算符
printf("x = %d\n", (*(pptr + 4)).x);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:39:03