目录
一、引言
今天菜哥在看王利涛老师编写的《嵌入式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,但是在实际的应用中还是要配套的,不然会引起内存泄漏哦!)
五、总结
关于零长度数组的内容呢,菜哥就介绍这么多,至于怎么应用,就要看你在什么场合来使用了,不要为了使用而去用,要做到的是它在某种场合下能带来奇效,那么这时候我们就应该使用他;零长度数组需要和变长结构体来结合使用,至于变长多少就要看你自己的实际应用需求了,最后别忘记了释放内存空间哦!嘻嘻,菜哥在文中若是有说的不对的地方还请各位指出来,欢迎大家在评论区留言哈!对啦,菜哥是一个又菜又爱玩的人!