C语言:获取结构体大小及二级结构体指针指向元素数量的方法
关于C语言结构体大小的两个常见问题
1. 如何在C语言中获取结构体的大小?
嘿,这事儿超简单——直接用C语言内置的sizeof运算符就搞定了!sizeof会帮你计算出目标类型(包括你自定义的结构体)在当前系统环境下占用的总字节数,连结构体的内存对齐差异都会自动处理,不用你手动算。
举个实际的例子:
#include <stdio.h> // 定义一个自定义结构体 struct person { char name[20]; int age; float height; }; int main() { // 直接用sizeof获取结构体类型的大小 printf("Size of struct person: %zu bytes\n", sizeof(struct person)); // 也可以用结构体变量来计算,结果是一样的 struct person p; printf("Size of person variable p: %zu bytes\n", sizeof(p)); return 0; }
注意哦:不同编译器、不同系统的内存对齐规则可能不一样,所以同一个结构体在32位和64位系统下的大小可能会有差异,但sizeof给出的结果肯定是当前环境下的正确值。
2. 二级结构体指针struct person **angest=NULL,指向的集合有22个person结构体,能用sizeof获取元素数量吗?
很遗憾,完全不行。原因很简单:struct person **本质上就是个指针类型,sizeof(angest)得到的只是这个指针本身在当前系统下的大小(比如32位系统是4字节,64位是8字节),和它指向的集合里有多少个元素半毛钱关系都没有。
为什么会这样?因为C语言里,当你用指针来指代一个动态分配的数组或者集合时,指针本身只记录了起始地址,完全不会保存数组的长度信息。二级指针更是如此——它只知道自己指向的是一个struct person*类型的指针,根本不知道这个指针后面跟着多少个同类型的元素。
那该怎么获取元素数量呢?给你两个靠谱的方案:
- 方案一:如果是静态数组(非动态分配)
如果你一开始是用数组来存储这些指针的,比如:
这时候可以用struct person *angest[22]; // 静态数组,存储22个person指针sizeof(angest) / sizeof(angest[0])来计算元素个数,因为静态数组的大小信息是在编译期就确定的,sizeof(angest)会返回整个数组的总字节数,除以单个元素的字节数(也就是struct person*的大小),就能得到元素数量。 - 方案二:手动维护一个计数变量
如果是动态分配的集合(比如用malloc/calloc分配的),比如:
这时候必须自己额外维护一个int count = 22; struct person **angest = malloc(count * sizeof(struct person*));count变量,每次添加或删除元素的时候同步更新这个变量——这是C语言里处理动态集合最常用的方式,没有之一。
内容的提问来源于stack exchange,提问作者Fkcm95




