变长结构体

1、什么叫变长结构体?
如下所示:

struct var_st
{
    int len;
    char data[0];  //c99支持
};

sizeof(struct var_st)=4;
注意
可能有的编译器不支持char data[0];需要用char data[1]代替,这样上面结构体大小是sizeof(struct var_st)=8(字节对齐);

那结构体是怎么实现可变长的呢?
如上所示,结构体中的最后一个元素是一个没有元素的数组。我们可以通过动态开辟一个比结构体大的空间,然后让data去指向那些额外的空间,这样就可以实现可变长的结构体了。更为巧妙的是,我们甚至可以用len存储字符串data的长度。

示例代码1
用[0]的数组

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct var_st
{
    int len;
    char data[0];
};

int main()
{
    int len = 10;    //需要多开辟10个字节的空间
    char str[10] = "123456789";

    printf("sizeof(struct var_st) = %d\n",sizeof(struct var_st));

    struct var_st *my_data = malloc(sizeof(struct var_st)+len);   //申请足够大的内存空间
    memcpy(my_data->data,str,len);
    printf("my_data's data is:%s\n",my_data->data);

    free(my_data);  //直接释放内存

    return 0;
}

运行结果
在这里插入图片描述
示例代码2
用指针指向数据域部分

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct var_st
{
    int len;
    char *data;
};

int main()
{   
    int len = 10;
    char str[10] = "123456789";

    printf("sizeof(struct var_st) = %d\n",sizeof(struct var_st));

    struct var_st *my_data = malloc(sizeof(struct var_st));  
    my_data->data = (char*)malloc(len);    //为数据域单独开辟内存空间
    memcpy(my_data->data,str,len);

    printf("my_data's data is:%s\n",my_data->data);

    free(my_data->data);  //先释放数据域的内存
    free(my_data);            //再释放指向结构体的指针变量

    return 0;
}


运行结果**在这里插入图片描述

对比上面两个程序,我们能发现:

  1. 存储大小方面:代码1的结构体占用内存最小,代码2有个指针占用8字节
  2. 数据连续存储方面:代码1的结构体数据是在连续的存储空间下;而代码2的数据域是单独开辟的空间。
  3. 释放内存方面:代码1可以直接释放;而代码2是指针的方式,需要先释放数据域部分,才能释放指向结构体的指针变量,否则会内存泄露。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

⁽⁽ଘ晴空万里ଓ⁾⁾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值