1. 背景

C89标准规定初始化语句的元素以固定顺序出现,该顺序即待初始化数组或结构体元素的定义顺序。

C99标准新增指定初始化(Designated Initializer),即可按照任意顺序对数组某些元素或结构体某些成员进行选择性初始化,只需指明它们所对应的数组下标或结构体成员名。GNU C将其作为C89模式的扩展。

借助指定初始化特性,可实现数组或结构体元素的快速初始化。

2. 数组初始化

在数组初始化列表中使用“[index常量表达式]=value”形式可对index所指定的某个元素进行初始化。如:

int arr[6] = { [0]=5, [1]=6, [3] =10, [4]=11 }; 或int arr[6] = { [0]=5, 6, [3] =10, 11 }; 或int arr[6] = { [3] =10, 11, [0]=5, 6 }; (指定顺序可变)均等效于:int arr[6] = {5, 6, 0, 10, 11, 0};

说明:

1) 若在某个指定初始化项目后跟有不至一个值,如[3]=10,11。则多出的数值用于对后续的数组元素进行初始化,即数值11用来初始化arr[4]。

2) C数组初始化一个或多个元素后,未初始化的元素将被自动地初始化为0或NULL(针对指针变量)。未经过任何初始化的数组,所有元素的值都是不确定的。

当下标是字符或属于枚举类型时,标识数组初始化语句的元素特别有用。如:

int whitespace[256] = {[' '] = 1, ['\t'] = 1, ['\h'] = 1,['\f'] = 1, ['\n'] = 1, ['\r'] = 1 };static const char* gMsgName[] = {[MSG_CREATE] = "Create",[MSG_DELETE] = "Delete",[MSG_SET]    = "Set",[MSG_GET]    = "Get",[MSG_GET_ALARMS] = "GetAlarms",[MSG_SET_TABLE]  = "SetTable"}; //枚举值变化时,数组自动同步更新

这种初始化方式可实现简化的映射表,不过在下标指示符跨度较大时稍显浪费内存。

GNU C还支持”[first … last]=value”(…两侧有空格)的形式,将该范围内的若干元素初始化为相同值。如:

int arr[]={ [0 ... 3]=1, [4 ... 5]=2, [6 ... 9] =3}; 或int arr[]={ [0 ... 3]=1, [4 ... 5]=2, [6 ... 8] =3, [9] =3};均等效于:int arr[10] = {1, 1, 1, 1, 2, 2, 3, 3, 3, 3};

注意,数组长度为指定的最大下标值加1。

这种初始化方式比memset高效且用途更广,如:

int arr[]={ [0 ... 127]=-1 };等效于:memset(arr, 0xFF, sizeof(arr));int arr[]={ [0 ... 127]=1 };不等效于:memset(arr, 1, sizeof(arr));

3. 结构体初始化

结构的指定初始化语法与数组类似,只不过使用点运算符和成员名(而不是方括号和索引值)标识具体的元素。例如,对于结构体

struct Structure{ int a; int b; };或struct Structure{ int a, b; };

有以下几种初始化方式:

struct Structure tStct = {.a = 1,.b = 2};用“.fieldname=”指定待初始化成员名(成员初始化顺序可变)

struct Structure tStct = {a : 1,b : 2};用“fieldname:”指定待初始化成员名(成员初始化顺序可变)GCC 2.5已废除,但仍接受

struct Structure tStct = { 1, 2};

内核结构体多采用第一种初始化方式,如Linux-2.6.x/drivers/usb/storage/usb.c设备驱动程序中:

static struct usb_driver usb_storage_driver = {.owner = THIS_MODULE,.name = "usb-storage",.probe = storage_probe,.disconnect = storage_disconnect,.id_table = storage_usb_ids,};

该方式初始化时不必严格按照定义时的顺序,灵活性很高。

【例】定义如下结构体

struct book{char title[MAXTITL];char author[MAXAUTL];float value;int mask[128];};

可按照任意顺序使用指定初始化项目:

struct book gift = { .value = 25.99,.author = "James Broadfool",.title = "Rue for the Toad",.mask[0 ... 127] = -1};

也可只初始化结构体成员value:

struct book surprise = { .value = 10.99 };

正如数组一样,跟在指定初始化项目后且没有指示符(“[index]”或“fieldname”)的常规初始化项目为跟在指定成员后定义的下个成员提供初始值。此外,若对特定成员初始化多次,则最后一次赋值是它实际获得的值。

考虑下列声明:

struct book gift = { .value = 18.90,.author = "Philionna pestle",0.25};

将把值0.25赋给成员value,因为它在结构体定义中紧跟在author成员之后。新值0.25覆盖前值18.90。

若覆盖初始化有副作用(如类型不兼容),则GNU C可能会产生编译警告。

联合体初始化

可用“.fieldname” (或已废弃的“fieldname:”)指示符来指定使用联合体的哪个元素,如:

union UnionT { int i; double d; };union UnionT tUnion = { .d = 4 };

使用第二个元素将4转换为double类型存入联合体。相反,将4转换为union UnionT类型则会把它作为整数i存入联合体。

5 结构体数组初始化

可在“=”前写上一系列的“[index]”和“.fieldname”指示符来指定待初始化的嵌套子对象,如:

struct Structure ptStct[10] = {[2].b = 0x2B, [2].a = 0x2A,[0].a = 0x0A };

6 GCC扩展结构体赋值

对于上文定义的结构体Structure可整体赋值:

struct Structure tStct1, tStct2;tStct2 = tStct1;

结构体也可作为函数返回值对另一个结构体赋值:

struct Structure func1();struct Structure tStct = func1();

转载于:https://www.cnblogs.com/qiyuexin/p/9009699.html

C89,C99: C数组结构体联合体快速初始化相关推荐

  1. java 结构体数组初始化_C数组结构体联合体快速初始化

    背景 C89标准规定初始化语句的元素以固定顺序出现,该顺序即待初始化数组或结构体元素的定义顺序. C99标准新增指定初始化(Designated Initializer),即可按照任意顺序对数组某些元 ...

  2. 基础C语言知识串串香10☞数组字符串结构体联合体枚举

    五.数组&字符串&结构体&联合体&枚举 5.1.c语言中定义一个字符串:char a[6]={'l','i','n','u','x','\0'};'\0'的字符编码为0 ...

  3. c语言结构体联合体与枚举考点,C语言-结构体+联合体+枚举

    #include #include #include //1.结构体:是一种构造数据类型 //结构体的用途:把不同的数据类型整合起来,成为一个自定义的数据类型 //1.1 定义一个结构体(定义结构体的 ...

  4. 【C语言】中的版本规范(C89 C99等)

    C语言中的版本 一.相关基础知识 ISO:国际标准化组织(International Organization for Standardization,ISO)简称ISO,是一个全球性的非政府组织,是 ...

  5. C标准-->C89/C99/C11

    版权声明:本文为CSDN博主「quectel-wifi」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/xie ...

  6. nginx中的数组结构ngx_array_t

    nginx中的ngx_array_t类似于c语言中的数组,其是基于内存池动态分配的.主要包含在文件src/core/ngx_array.h和/src/core/ngx_array.c两个文件中. 1. ...

  7. 输出php数组结构,在PHP中输出数组结构使用 函数 。

    在PHP中输出数组结构使用 函数 . 更多相关问题 南京长江第三大桥是什么时候通车的?() 抗爆性可以判断汽油在发动机中燃烧是否易于发生不正常的(). 道岔尖轨.心轨.基本轨的爬行.窜动量不得超()m ...

  8. PHP版本区别5与7:性能 64位 运算符 输入类型 返回类型 匿名类;7改进1.变量存储空间2.数组结构3.函数调用机制

    1.性能提升:PHP7比PHP5.0性能提升了两倍. 2.全面一致的64位支持. 3.以前的许多致命错误,现在改成抛出异常. 4.PHP 7.0比PHP5.0移除了一些老的不在支持的SAPI(服务器端 ...

  9. 9.IDA-重新设置函数类型、创建数组结构

    1.重新设置函数类型 写一个简单的代码做测试: [cpp] view plaincopy int fun(int a, double b) { return 0; } int _tmain(int a ...

最新文章

  1. 人均年薪400万、公司年亏40亿,正在盖大楼的DeepMind最新财务数据曝光
  2. *13.图的存储方式
  3. List去重为什么要写equals(),hashCode()方法
  4. (数据结构)前缀,后缀以及中缀表达式
  5. 可变参数模板(参考《C++ Templates 英文版第二版》)
  6. 怎么下载完整的python_怎么下载python并安装
  7. 开门红讨采头,开工喜庆红色PSD分层海报模板
  8. 分分钟搞定阿里云私有Docke镜像仓库的搭建
  9. AtCoder Regular Contest 061 DSnuke's Coloring
  10. php中的http是什么意思,请问php中三种http请求方式有什么区别呢(cURL,stream,socket)...
  11. Matlab函数——wgn
  12. 树莓派4B改装RC玩具车玩转opencv系列教程(一)树莓派基础入门篇------Hello Raspberry Pi OS(Rasbian )!
  13. 基于ssm的记账管理系统设计与实现【毕业设计jsp】
  14. 办公软件应用计算机操作员四级,计算机操作员四级证书有用吗
  15. 基于Java的奖学金评定系统的设计
  16. ExcelVBA之InputBox函数
  17. Java多线程篇--AQS
  18. 《University Calculus》-chaper8-无穷序列和无穷级数-比值审敛法
  19. 安装Ubuntu16.04视频播放器smplayer
  20. 如何正确计算LINUX内存使用率

热门文章

  1. java sqlexec_java 执行Sql文件
  2. android属性动画作用范围,Android 属性动画:这是一篇全面 详细的 属性动画 总结攻略...
  3. 复练-关于面试的技能树-自信从容的参加面试
  4. element 下拉选择_猿实战18——商品发布之类目选择
  5. 移动端实现蓝牙打印机打印_MBrush世界上最小的移动彩色打印机
  6. IntelliJ Idea 常用快捷键 (经过测试)
  7. netapp脚本保存日志_Shell脚本实战:日志关键字监控+自动告警
  8. mysql slave 1062_MySQL主从不同步,出现1062错误解决方案
  9. css修改select选择框option被选中的背景颜色_这 16 个 CSS 伪类,助你提升布局效率!
  10. python3.7.2安装pywifi_python pywifi