C语言面试干货——指定数组初始化器(GCC手册解析)
本人就职于国际知名终端厂商,负责modem芯片研发。
在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。
指定数组初始化器(Designated Initializers)
背景
在ISO C90中,初始化数组或者结构体要求每个元素按照固定的顺序出现,带来的问题就是如果我们想初始化数组或结构体中的某个元素,那我们必须也手动初始化这个元素之前的元素。
在ISO C99中,你可以使用数组下标或者结构体的成员名实现乱序初始化,并且GNU C对这个功能进行了扩展,使得在C90中也可以使用。
初始化数组
int a[6] = { [4] = 29, [2] = 15 };
//等价于C90中的
int a[6] = { 0, 0, 15, 0, 29, 0 };
再看一个例子
#include<stdio.h>
int main(void)
{
int a[]={0,1,2,3,[2]=5,6,9,10};
printf("size is %zd\n",sizeof(a)/sizeof(int));
for(int i=0;i<sizeof(a)/sizeof(int);++i)
printf("%d ",a[i]);
return 0;
}
输出如下:
看到这里有些同学蒙了,为什么size is 6?为什么[3]=6而不是3?
我们通过下图进行解释:
当初始化指针重置回index=2的位置后,后面的初始化工作会基于重置后的位置继续完成,所以index=3的值初始化为6(原始值为3)
再看下面这段code
#include<stdio.h>
int main(void)
{
int a[]={0,1,2,3,[7]=5,6,9,10};
printf("size is %zd\n",sizeof(a)/sizeof(int));
for(int i=0;i<sizeof(a)/sizeof(int);++i)
printf("%d ",a[i]);
return 0;
}
输出为:
这个例子中我们并没有明确初始化数组a的index=4,5,6位置的值,这种情况下编译器会将其初始化为0。
初始化指定范围的数组元素
这不是标准C中的功能,时GNU的一个扩展功能,使用 [first … last] = value的格式进行初始化,例如
/* [first ... last] = value 注意"..."与first和last之间的空格 */
/* 漏掉空格编译器会报错 */
int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
上面的code将数组widths的index=0-9初始化为1,index=10-99初始化为2,index=100初始化为3
看下面这段code
#include<stdio.h>
int main(void)
{
int a[]={[0 ... 7]=5,6,[2]=9,10};
printf("size is %zd\n",sizeof(a)/sizeof(int));
for(int i=0;i<sizeof(a)/sizeof(int);++i)
printf("%d ",a[i]);
return 0;
}
输出如下:
产生这样输出结果的原因与上面的原因一样,同学们自行理解。
上面的例子数组长度都是编译器负责计算的,下面我们看一个例子,这个例子中我们自行指定数组的长度:
int a[6] = { [1] = v1, v2, [4] = v4 };
//等价于
int a[6] = { 0, v1, v2, 0, v4, 0 };
在明确指定了长度的数组中,我们未初始化的元素编译器会帮我们进行初始化为0。
对于自动存储类型的数组,如果我们没有任何一个元素进行初始化,则整个数组的值都是未定义的;
对于自动存储类型的数组,如果我们初始化了一个或以上的元素,则其余未初始化的元素编译器会自动帮我们初始化为0。
相关文章
- C语言图形函数编程
- 【C语言入门教程】4.6 指针 和 数组
- 【C语言入门教程】4.3 多维数组
- 学习C语言的数组
- C语言printf()输出格式大全
- C语言深入理解通过指针引用多维数组(指针中使用起始地址 元素地址 元素值的区分)...
- 用C语言实现中文到unicode码的转换
- Java C# C语言中的占位符
- Linux 底下使用C语言的 单链表 ,双链表,二叉树 读取文件,并排序
- ZZNUOJ_C语言1020:两整数排序(完整代码)
- ZZNUOJ_C语言1029:三角形判定(完整代码)
- ZZNUOJ_C语言1111:多个整数的逆序输出(函数专题)(完整代码)
- ZZNUOJ_C语言1117:查找数组元素(完整代码)
- ZZNUOJ_用C语言编写程序实现1172:密码解密(指针专题)(附完整源码)
- ZZNUOJ_用C语言编写程序实现1236:数的逆转(附完整源码)
- 能让你成为更优秀程序员的10个C语言资源
- 练习 1-8 编写一个统计空格、制表符与换行符个数的程序。// C语言
- C语言实现用指定字符切割字符串并返回数组
- 【C语言】之数组
- C语言中数组长度的计算详解
- C语言使用技巧(十一):判断数组中是否存在某个数 / break的一个小技巧
- C语言之数组和指针位移的本质(四十五)
- 全面解析C语言多媒体开源框架GStreamer
- C语言逆向——数组和结构体,数组多维只是一个编译构造的假象,本质会转成一维数组,结构体的话最难的就是对齐了
- C语言---数组---总结
- 在Linux环境下运行你的第一个C语言程序
- 【维生素C语言】数组笔试题(附答案+详解)