C语言面试干货——指定结构体初始化器(GCC手册解析)
Posted 从善若水
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言面试干货——指定结构体初始化器(GCC手册解析)相关的知识,希望对你有一定的参考价值。
本人就职于国际知名终端厂商,负责modem芯片研发。
在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。
指定结构体初始化器(Designated Initializers)
背景
在ISO C90中,初始化数组或者结构体要求每个元素按照固定的顺序出现,带来的问题就是如果我们想初始化数组或结构体中的某个元素,那我们必须也手动初始化这个元素之前的元素。
在ISO C99中,你可以使用数组下标或者结构体的成员名实现乱序初始化,并且GNU C对这个功能进行了扩展,使得在C90中也可以使用。
初始化struct
通过结构体成员名初始化结构体 “.fieldname =”,例如下面的code
struct point { int x, y; };
struct point p = { .y = yvalue, .x = xvalue };
//等价于
struct point p = { xvalue, yvalue };
还有一种初始化方式“fieldname:”,但是这种方式在GCC 2.5中已经不推荐使用了。
看下面一段code
#include<stdio.h>
struct point { int x, y; };
int main(void)
{
struct point pt={.y=2};
printf("pt.x = %d \\n",pt.x);
printf("pt.y = %d \\n",pt.y);
return 0;
}
输出如下:
这段code中我们并没有显示初始化成员变量x,这种情况下编译器会自动初始化该变量为0。
我们可以结合“.fieldname” 和“[index]”来初始化一个数组,看下面的code
struct point { int x, y; };
struct point ptarray[10] = { [2].y = yv2, [2].x = xv2, [0].x = xv0 };
初始化union
同理对于struct的初始化工作,同样可以应用在union上,例如下面的code
union foo { int i; double d; };
union foo f = { .d = 4 };
对于重复初始化的说名
- 如果struct中相同的field被多次初始化,则使用最后被修改的值作为初始化的值;
- 或者union中的overlapping fields被多次初始化,则使用最后被修改的值作为初始化的值。
以上是关于C语言面试干货——指定结构体初始化器(GCC手册解析)的主要内容,如果未能解决你的问题,请参考以下文章