c语言之零长度数组

目录

一、引言

二、零长度数组操作原理

三、零长度数组与指针的对比

四、零长度数组的应用

五、总结


一、引言

       今天菜哥在看王利涛老师编写的《嵌入式C语言自我修养--从芯片、编译到操作系统》这本书中提到了“零长度数组”的这个概念,觉得很新奇哇!于是通读了一下该章节,也深入思考了一下,发觉这是个很神奇的东东哇!所以今天我们就来唠唠“零长度数组”的故事吧!

二、零长度数组操作原理

首先我们来看一下下面这段代码:

struct Data{
    
    int len;
    char a[0];

};

        一般情况下,大家都很不屑的说,你在教我玩结构体呢?哈哈,这的确是c中的结构体的定义 ;我们很容易看出来,但是可能您看到a[0]的时候就开始犯迷糊了,定义数组还能这么玩呢?我们这个数组的长度竟然为0,那定义它他有什么意义呢?嘻嘻,古人云:存在即合理!先来让我们看看这个结构体占多大的内存空间吧!

        嘻嘻,你是否看到了,咱们的Data结构只占用的4个字节大小的空间,这不正是int类型所占的空间大小么?再看看我们在结构体中定义的第一个成员的类型,是不是int类型呢?这是不是就说明我们定义的第二个成员变量,编译器并未给它分配相应的内存空间呢!到这里,有的小伙伴就开始说!这又有什么用呢?嘻嘻,别急我们往下面继续看看! 

三、零长度数组与指针的对比

       首先我们来做个测试,先定义两个结构体,示例如下:

struct data1{

    int len;
    int a[0];
};

struct data2{

    int len;
    int* a;
};

//32bit的机器下

size1 = sizeof(struct data1);

size2 = sizeof(struct data2);

输出结果如下:

size1 = 4;

size2 = 8;

       至于结果为什么是这样的,还请大家动脑思考,或者去实际操作一下下! 

四、零长度数组的应用

       零长度数组的应用一般与变长结构体结合来使用,这里能菜哥给大家简单的写了一个测试demo,我们一起来看看吧!首先呢,我们先来定义一个变长结构体,这个结构体呢就如文章首所展示的那个结构体哦,下面我们来看看是怎么应用的呢?

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

//变长结构体
struct Data{
    
    int len;
    char a[0];        //零长度数组

};


int main()
{
    struct Data* data;

    printf("struct Data size is: %lu \n", sizeof(struct Data));

    data = malloc(sizeof(struct Data) + 20);

    if(data == NULL){
        printf("data is null, not have enough space!\n");
        return -1;
    }

    data->len = 20;

    strncpy(data->a, "asdfghjk", 10);

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

    free(data);

    return 0;
    
}

        嘻嘻,这个个测试代码还是比较简单一些的,我相信大家应该是能看懂的哦!来看看最终测试demo的输出结果吧 !(记得,养成一个好习惯,就是malloc和free需要配套使用哦!当然你在写测试的时候可以不用free,但是在实际的应用中还是要配套的,不然会引起内存泄漏哦!)

 

五、总结

       关于零长度数组的内容呢,菜哥就介绍这么多,至于怎么应用,就要看你在什么场合来使用了,不要为了使用而去用,要做到的是它在某种场合下能带来奇效,那么这时候我们就应该使用他;零长度数组需要和变长结构体来结合使用,至于变长多少就要看你自己的实际应用需求了,最后别忘记了释放内存空间哦!嘻嘻,菜哥在文中若是有说的不对的地方还请各位指出来,欢迎大家在评论区留言哈!对啦,菜哥是一个又菜又爱玩的人!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值