C语言初始化在开发中的几种写法
C语言初始化在开发中的几种写法
使用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将鼠标放在最后的花括号上,能显示初始化后的具体含义:
其中,SYS_xxx
是一些宏,表示System call numbers。经过查找,这是GCC编译器特有的无序初始化数组的方式:
在声明数组时,可以通过在一组花括号中列出初始化值(用逗号分隔)来初始化数组中的元素。这里有一个例子:
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
.) 另外,注意你必须在"..."的两边有空格。