C语言初始化在开发中的几种写法

C语言初始化在开发中的几种写法

参考:C语言结构体初始化的四种方法_ericbars的博客-CSDN博客

使用memset函数

用于赋值为全0:

struct sockaddr_in cliaddr;
memset(&cliaddr, 0, sizeof(cliaddr));

使用{}列表初始化

struct InitMember test = {-10,3.141590,"method one",0.25};
struct sockaddr_in cliaddr = {}; // 初始化为全0

结构体初始化时成员名前加.的写法

乱序赋值:

static struct platform_driver dm9000_driver = {
	.driver	= {
		.name    = "dm9000",
		.pm	 = &dm9000_drv_pm_ops,
		.of_match_table = of_match_ptr(dm9000_of_matches),
	},
	.probe   = dm9000_probe,
	.remove  = dm9000_drv_remove,
};

可以看到,在初始化时使用了.结构体成员名的写法。

这是GCC编译器支持的写法,用于初始化结构体成员时可以不按照成员的定义顺序,例:

struct atag_tcc_entry {
 char output;
 char resolution;
};

struct atag_tcc_entry tcc_param = {
 .output = 0,
 .resolution = 0,
};

上面初始化可写为(以下是赋值,与初始化有本质区别):

struct atag_tcc_entry tcc_param;//定义结构变量
//分别初始化成员
atag_tcc_entry tcc_param.output = 0;
atag_tcc_entry tcc_param.resolution = 0;

数组初始化使用[]的写法

使用VSCODE将鼠标放在最后的花括号上,能显示初始化后的具体含义:

image

其中,SYS_xxx 是一些宏,表示System call numbers。经过查找,这是GCC编译器特有的无序初始化数组的方式:

image

在声明数组时,可以通过在一组花括号中列出初始化值(用逗号分隔)来初始化数组中的元素。这里有一个例子:

int my_array[5] = { 0, 1, 2, 3, 4 };

你不必显式地初始化所有数组元素。例如,这段代码初始化指定的前三个元素,然后初始化最后两个元素为默认值0:

int my_array[5] = { 0, 1, 2 };

当使用ISO C99或带有GNU扩展的C89时,您可以通过指定要初始化的数组下标来无序地初始化数组元素。为此,将数组下标括在括号中,并可选地在值之前加上赋值操作符。这里有一个例子:

int my_array[5] = { [2] 5, [4] 9 };

或者,使用赋值操作符:

int my_array[5] = { [2] = 5, [4] = 9 };

这两个例子都等价于:

int my_array[5] = { 0, 0, 5, 0, 9 };

当使用GNU扩展时,您可以将一系列元素初始化为相同的值,通过指定第一个和最后一个索引,格式为 [first] ... [last] 。这里有一个例子:

int new_array[100] = { [0 ... 9] = 1, [10 ... 98] = 2, 3 };

初始化元素0到9到1,初始化元素10到98到2,初始化元素99到3。(你也可以显式地写 [99] = 3.) 另外,注意你必须在"..."的两边有空格。

参考自:The GNU C Reference Manual

posted @ 2023-05-20 23:36  3的4次方  阅读(83)  评论(0编辑  收藏  举报