char data[0]问题

本文探讨了C语言中利用char data[0]作为结构体成员来简化内存管理的问题。这种方式使得结构体的大小为4字节,避免了在64位系统上额外的指针大小。通过一次malloc分配结构体和内存,解决了分配和释放的繁琐步骤,同时也减少了内存碎片。然而,这种做法是非标准的GNU C扩展,虽然在某些场景下提高了效率,但在跨平台和安全性方面存在风险,建议使用C99标准的flexible array member替代。
摘要由CSDN通过智能技术生成

问题:当进行内存管理时,经常需要一个额外的结构,例如

struct MyData

{

    char*data;  // 指向分配的内存空间

    intlen;  // 记录空间大小

};

这样,需要进行四步操作,先分配MyData结构体,再分配要管理的内存,再让data指针指向该内存空间,再把空间大小赋给len。问题,该结构在64位系统上sizeof结果是多少?可以修改结构体的情况下有什么办法能够减少操作?

 

这实际上是有关char data[0]的问题。

struct MyData

{

    int len;

    char data[0];  // 一定是结构体的最后一个字段,且前面必须有其他字段

};

在结构中,data是一个数组名;但该数组没有元素;由于数组没有元素,该数组在该结构体中不占用空间,所以sizeof(struct Mydata) = 4,这不同于char* data,要占用一个指针的大小(32位系统下4字节,64位系统8字节)。该数组的真实地址紧随结构体MyData之后,而这个地址就是结构体后面数据的地址(如果给这个结构体分配的内容大于这个结构体实际大小,后面多余的部分就是这个data的内容);这种声明方法可以巧妙的实现C语言里的数组扩展。

使用:

    struct MyData *p = (struct MyData *)malloc(sizeof(struct MyData)+strlen(str))

这样就

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值