You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动