在C语言中,初始化结构体时并不是必须为每个成员显式地赋值。如果某些成员没有被显式初始化,编译器会按照一定规则为这些成员赋默认值。
- 静态或全局变量会被自动初始化为零(如果是指针类型值为NULL,NULL表示空指针)。
- 局部变量如果没有显式初始化,未被初始化的成员会包含未定义值(随机值)。
比如下面这个结构体:
typedef struct InputDevice {
char *name;
int (*GetInputEvent)(PInputEvent ptInputEvent);
int (*DeviceInit)(void);
int (*DeviceExit)(void);
struct InputDevice *ptNext;
}InputDevice, *PInputDevice;
我初始化的代码可否不初始化成员ptNext
,即像下面这样初始化:
static InputDevice g_tTouchscreenDev ={
.name = "touchscreen",
.GetInputEvent = TouchscreenGetInputEvent,
.DeviceInit = TouchscreenDeviceInit,
.DeviceExit = TouchscreenDeviceExit,
};
此时由于 g_tTouchscreenDev 是一个全局变量或静态变量(注意:前面的static并不一定是表示这个变量是静态变量,也有可能表明这个全局变量只在当前文件内有效),则ptNext会被初始化为空指针,即值为 #define NULL (void *)0
当然,最好是显式指定,所以上面这个结构体实例化严格地说,应该是像下面这样写:
static InputDevice g_tTouchscreenDev = {
.name = "touchscreen",
.GetInputEvent = TouchscreenGetInputEvent,
.DeviceInit = TouchscreenDeviceInit,
.DeviceExit = TouchscreenDeviceExit,
.ptNext = NULL,
};