如何在 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_TNULL (这是一个有意义的操作)。