C语言柔性数组

文章介绍了C99标准中柔性数组的概念,强调它必须位于结构体的最后,且不包含在结构体尺寸中。提到柔性数组的动态分配与释放内存的重要性,以及字节对齐对结构体大小的影响。文中提供了一个示例演示了如何分配和使用柔性数组,并提醒注意数组越界和内存释放的问题。
摘要由CSDN通过智能技术生成

在C99标准中引入了柔性数组,在结构体中,我们需要将柔性数组放在所有成员的最后一位(也就是说,一个结构体中。只能有一个柔性数组)。下面是一些使用柔性数组的时候需要注意的一些事情。

        1.柔性数组必须是结构体最后一个成员

        2.柔性数组不能作为结构体指针的指向类型,因为结构体的长度不包括柔性数组的长度,使用时需要通过指针偏移来访问柔性数组

        3.柔性数组需要动态开辟空间,也要记得及时释放。防止内存泄漏。如果结构体也是malloc在堆上的话,记得先释放柔性数组。

        4.注意数组越界问题

下面给一个小demo吧,大家也可以在自己电脑上运行一下。

typedef struct flexarr{
    int first;
    short flexarray[0];
}flexarr;

这个是结构体的定义,然后下面是main函数(首先我们看一下我们定义的结构体的大小)

int main(){
    flexarr temp;
    printf("%d",sizeof(temp));
}

结果有点意外,是8。我们上篇博客说到,柔性数组不占大小。但为什么是8呢,因为字节对齐的缘故,该结构体成员类型中最大的数据类型所占字节大小为double(8),所以结果必须是8的整数被即4+4=8。字节对齐方式的话和编辑器,操作系统有关。可以自己去设置┗|`O′|┛ 嗷~~。所以大家得出的结构可能会不一样,vs,clion或者命令行可能有差异。我们求同存异吧。

下来我们申请一个结构体大小然后并为其赋初值,最后将其释放。

int main(){
    flexarr *temp=(flexarr*)malloc((sizeof(flexarr)+sizeof(short)*5));
    temp->flexarray[0]=0x1234;
    temp->flexarray[1]=0x1234;
    temp->flexarray[2]=0x1234;
    temp->flexarray[3]=0x1234;
    temp->flexarray[4]=0x1234;
    printf("%x",temp->flexarray[4]);
    free(temp->flexarray);
    free(temp);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值