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)的语法糖,整个操作分为两步:
- 指针偏移:
arr是Point*类型,做加法时会自动按Point的大小做步长偏移,arr + ind就指向第ind个结构体的起始地址 - 解引用后得到
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
相关产品推荐
相关产品推荐

