C语言0长度数组(柔性数组)】的更多相关文章

0长度数组,又称为柔性数组(flexible array).通经常使用来实现变长数组.常见于TLV(type-length-value)的数据结构中. 在标准 C 和 C++ 中,不同意用 0 长度数组,但在 GNU C 中,却能够定义 0 长度数组(在C99之前写成长度为0,C99中能够直接不写索引).一般会拿手冊中给的样例来说明 struct line {          int length;          ]; // char contents[]; //C99 } 从打印出来的结…
柔性数组(Redis源码学习) 1. 问题背景 在阅读Redis源码中的字符串有如下结构,在sizeof(struct sdshdr)得到结果为8,在后续内存申请和计算中也用到.其实在工作中有遇到过这种 struct结构 + 应用数据的情况,但没有意识到自己使用的是柔性数组,在学习阅读Redis代码中,遇到该方法,就特总结记录之. /* * 类型别名,用于指向 sdshdr 的 buf 属性 */ typedef char * sds; /* * 保存字符串对象的结构 */ struct sds…
前面在看Xen的源码时,遇到了一段代码,如下所示: 注意上面最后一行的代码,这里定义了一个长度为的数组,这种用法可以吗?为什么可以使用长度为0 的数组?长度为的数组到底怎么使用?……这篇文章主要针对该问题进行简单的讲解.废话不多说了,现在就开始. 长度为的数组在标准c和c++中是不允许的,如果使用长度为的数组,编译时会产生错误,提示数组长度不能为.但在GNUc中,这种用法却是合法的.它的最典型的用法就是位于数组中的最后一项,如上面所示,这样做主要是为了方便内存缓冲区的管理.如果你将上面的长度为的…
结构中最后一个元素允许是未知大小的数组,这个数组就是柔性数组.但结构中的柔性数组前面必须至少一个其他成员,柔性数组成员允许结构中包含一个大小可变的数组,sizeof返回的这种结构大小不包括柔性数组的内存.包含柔数组成员的结构用malloc函数进行内存的动态分配,且分配的内存应该大于结构的大小以适应柔性数组的预期大小.柔性数组到底如何使用? 欢迎关注我的个人博客:www.wuyudong.com, 更多精彩文章与您分享 不完整类型 C和C++对于不完整类型的定义是一样的,不完整类型是这样一种类型,…
#include<stdio.h> typedef struct _SoftArray{ int len; int array[]; }SoftArray; int main() { ; printf("The struct's size is %d\n",sizeof(SoftArray)); } 我们可以看出,_SoftArray结构体的大小是4,显然,在32位操作系统下一个int型变量大小刚好为4,也就说结构体中的数组没有占用内存.为什么会没有占用内 存,我们平时用数…
c编程的时候数组长度一般都是固定好的,实际上c还能实现变长数组.其实c99中确实是有变长数组的说法,C99中通过允许结构体中的最后一个成员是长度未知的数组实现变长数组,其定义格式如下: typedef struct _lin { int len; char data[]; }Lin; 有的编译器不接受,可以写成以下方式: typedef struct _lin { int len; char data[0]; }Lin; 接下来,用sizeof(Lin)测试一下这个结构体的实际大小,结果是4,非…
[前言]经常看到C语言里的两个数组,总结一下. 一.柔性数组 参考:https://www.cnblogs.com/veis/p/7073076.html #include<stdio.h> typedef struct _SoftArray{ int len; int array[]; }SoftArray; int main() { int len = 10; printf("The struct's size is %d\n",sizeof(SoftArray));…
转自C/C++ 中的0长数组(柔性数组) 在标准C和C++中0长数组如charArray[0]是不允许使用的,因为这从语义逻辑上看,是完全没有意义的.但是,GUN中却允许使用,而且,很多时候,应用在了变长结构体中,如: struct Packet { int state; int len; char cData[0]; //这里的0长结构体就为变长结构体提供了非常好的支持 }; 首先对0长数组做一个解释: 用途 :长度为0的数组的主要用途是为了满足需要变长度的结构体. 用法 :在一个结构体的最后…
在日常的编程中,有时候需要在结构体中存放一个长度动态的字符串,一般的做法,是在结构体中定义一个指针成员,这个指针成员指向该字符串所在的动态内存空间,例如: typedef struct test { int a; double b; char *p; }; p指向字符串.这种方法造成字符串与结构体是分离的,不利于操作.如果把字符串跟结构体直接连在一起,不是更好吗?于是,可以把代码修改为这样: char a[] = "hello world"; test *stpTest = (test…
一.柔性数组 今天看了公司的代码,发现一个很奇怪的问题,后来自己写了类似代码,我先把代码贴出来吧. #include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct { ]; ]; int usType; int usLen; char ucCode; char ucSeq; char ucSlot; char ucInfo[]; }DEV_CARD_MSG_S; int main(void)…