栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言0长度数组的妙用

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言0长度数组的妙用

1、0长度数组

      0长度数组的意思是数组的长度为0,比如int a[0],它编译后不占用内存空间,即sizeof(a) = 0。

      C99规定可以为变长数组 int len ; int array[len];也就是说数组是程序运行时候才指定数组的大小。常见的是进行输入数据进行初始化。

      GCC直接支持零长度数组,int a[0];零长度数组有一个特点就是不占用内存空间。0长度数组很少单独使用,一般是用在结构体中,不占用结构体长度,用于分配连续内存时使用。

2、0长度数组在结构体中的使用

     0长度数组常用在结构体中,如下代码就是一个结构体中带有0长度数组。此结构体sizeof(struct rndis_query_msg) = 7个字=28个字节长度,OIDInputBuffer[0]在结构体中未占用空间。

struct rndis_query_msg
{
    rt_uint32_t MessageType;
    rt_uint32_t MessageLength;
    rt_uint32_t RequestId;
    rt_uint32_t Oid;
    rt_uint32_t InformationBufferLength;
    rt_uint32_t InformationBufferOffset;
    rt_uint32_t Reserved;
    rt_uint8_t  OIDInputBuffer[0];
};
typedef struct rndis_query_msg* rndis_query_msg_t;

      OIDInputBuffer主要用在分配内存时访问结构体成员变量Reserved后面连续内存使用。比如要申请一个struct rndis_query_msg结构占用的内存空间,并且OIDInputBuffer指向的内存具有10个字节的空间可以使用。代码可像如下编写。

rndis_query_msg_t prndis = NULL;

prndis = malloc(sizeof(struct rndis_query_msg) + 10);

if(prndis)
{
    for(i = 0; i < 10; i++)
    {
        prndis->OIDInputBufferp[i] = i;
    }

}

3、支持的编译器

     0长度的数组的写法在IAR编译器,GCC编译器中支持。但是在keil编译器默认是不支持的,即使打开C99的设置也不好使。keil软件中需要在编译选项中增加--gcc来支持才能编译通过。

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/991098.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号