zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C语言面试干货——指定结构体初始化器(GCC手册解析)

C语言面试 解析 结构 指定 手册 初始化 干货
2023-09-14 09:13:08 时间

本人就职于国际知名终端厂商,负责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手册解析)


在这里插入图片描述