C语言结构体中的零长数组

本文探讨了C语言结构体中使用零长数组的原因,包括节约空间、加快速度和分配内存时的便利性。通过实例比较了零长数组与指针的区别,阐述了编译器如何处理这两种情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言结构体中的零长数组

实例

struct A
{
   
    int len;
    int var[0];
};

struct B
{
   
    int len;
    int *var;
}

其中,结构体A使用了零长数组,结构体B用了指针。

为什么要用零长数组

我归纳了以下三点原因:

  • 节约空间
    在int和指针占4字节的机器上

    sizeof(A) // 4
    sizeof(B) // 8
    

    这是因为A中的var是数组名,B中的var是指针变量,编译器对数组名和指针变量的处理方式不一样。
    我们可以把这些变量名看作一个地址(事实上编译器就是这么看的),编译时,编译器从一个变量名和地址的对应表中读取地址。一个变量名代表一个不变的地址常量。
    数组名就是一个地址常量。虽然指针名也是一个地址常量,但是指针名对应的地址储存的是一个值,这个值是另一个地址,这后一个地址才是数组真正存储的地方。因为数组直接表示目标地址,而指针间接指向目标地址,所以编译器直接把地址记住就行了,不需要再腾出地方存了。

    数组名指针名都是某个地址常量,但是指针存储的地址可变,所以有指针变量。

  • 加快速度
    上面已经说到数组名和指针的区别了。
    现在我们来看看编译器对数组和指针的不同使用方式。
    比如

    数组:
    int a[10
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值