如何在 C 中将二维指针结构数组初始化为 NULL?
How to initialize to NULL a 2D array of pointer structs in C?
我有以下结构:
typedef void (*HSM_State_Fcn)(void*, size_t);
typedef HSM_State_Fcn HSM_Dest_State_Fcn;
typedef uint8_t (*HSM_Guard_Fcn)(void*, size_t);
typedef void (*HSM_Action_Fcn)(void*, size_t);
typedef struct HSM_Transition_Tag
{
HSM_Dest_State_Fcn dest_fcn;
HSM_Guard_Fcn guard_fcn;
HSM_Action_Fcn action_fcn;
}HSM_Transition_T;
我有以下二维数组,我希望每个元素都是 NULL
:
static HSM_Transition_T Transition_Table_Array_Test[3][3] = {NULL};
如您所见,我尝试等于 {NULL}
但我收到以下警告:
警告:(接近 'Transition_Table_Array_Test[0]' 的初始化)[-Wmissing-braces]
将每个元素初始化为 NULL
的正确方法是什么?
如果我成功了:
static HSM_Transition_T Transition_Table_Array_Test[3][3] = {{NULL}};
我得到同样的错误。
你可以这样写:
static HSM_Transition_T Transition_Table_Array_Test[3][3] = {
{NULL, NULL, NULL},
{NULL, NULL, NULL},
{NULL, NULL, NULL}};
但是 NULL 主要用于指针而不是结构。
你会写(注意Transition_Table_Array_Test
前的'*':
static HSM_Transition_T *Transition_Table_Array_Test[3][3] = {
{NULL, NULL, NULL},
{NULL, NULL, NULL},
{NULL, NULL, NULL}};
static HSM_Transition_T* Transition_Table_Array_Test[3][3]={{NULL}};
NULL 应该与指针而不是结构一起使用。
如果要初始化二维结构数组中的结构字段,则
static HSM_Transition_T Transition_Table_Array_Test[3][3]={{{NULL,NULL,NULL}}};
您收到警告的原因是因为 NULL
是一个基本类型,但数组的元素是聚合;它们需要使用聚合变量(正确类型)或 yet third 括号表达式(就地构建聚合)进行初始化。
数组的类型不允许使用NULL
来初始化元素,因为结构值不能是NULL
,只能是指针。结构就地存在,所以它们不可能是数组中的 "absent"(数组的元素 是 结构;如果数组存在,它们也存在).
编译器抱怨仍然缺少大括号,而不是告诉你结构值不能是 NULL
,因为它认为你试图在 [=] 内初始化函数指针25=] HSM_Transition_T
到 NULL
(这是一个有意义的操作)。
我有以下结构:
typedef void (*HSM_State_Fcn)(void*, size_t);
typedef HSM_State_Fcn HSM_Dest_State_Fcn;
typedef uint8_t (*HSM_Guard_Fcn)(void*, size_t);
typedef void (*HSM_Action_Fcn)(void*, size_t);
typedef struct HSM_Transition_Tag
{
HSM_Dest_State_Fcn dest_fcn;
HSM_Guard_Fcn guard_fcn;
HSM_Action_Fcn action_fcn;
}HSM_Transition_T;
我有以下二维数组,我希望每个元素都是 NULL
:
static HSM_Transition_T Transition_Table_Array_Test[3][3] = {NULL};
如您所见,我尝试等于 {NULL}
但我收到以下警告:
警告:(接近 'Transition_Table_Array_Test[0]' 的初始化)[-Wmissing-braces]
将每个元素初始化为 NULL
的正确方法是什么?
如果我成功了:
static HSM_Transition_T Transition_Table_Array_Test[3][3] = {{NULL}};
我得到同样的错误。
你可以这样写:
static HSM_Transition_T Transition_Table_Array_Test[3][3] = {
{NULL, NULL, NULL},
{NULL, NULL, NULL},
{NULL, NULL, NULL}};
但是 NULL 主要用于指针而不是结构。
你会写(注意Transition_Table_Array_Test
前的'*':
static HSM_Transition_T *Transition_Table_Array_Test[3][3] = {
{NULL, NULL, NULL},
{NULL, NULL, NULL},
{NULL, NULL, NULL}};
static HSM_Transition_T* Transition_Table_Array_Test[3][3]={{NULL}};
NULL 应该与指针而不是结构一起使用。
如果要初始化二维结构数组中的结构字段,则
static HSM_Transition_T Transition_Table_Array_Test[3][3]={{{NULL,NULL,NULL}}};
您收到警告的原因是因为 NULL
是一个基本类型,但数组的元素是聚合;它们需要使用聚合变量(正确类型)或 yet third 括号表达式(就地构建聚合)进行初始化。
数组的类型不允许使用NULL
来初始化元素,因为结构值不能是NULL
,只能是指针。结构就地存在,所以它们不可能是数组中的 "absent"(数组的元素 是 结构;如果数组存在,它们也存在).
编译器抱怨仍然缺少大括号,而不是告诉你结构值不能是 NULL
,因为它认为你试图在 [=] 内初始化函数指针25=] HSM_Transition_T
到 NULL
(这是一个有意义的操作)。