如何在C中将指针结构的2D数组初始化为NULL?
我有以下结构:如何在C中将指针结构的2D数组初始化为NULL?,c,arrays,struct,C,Arrays,Struct,我有以下结构: 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_Fc
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;
我有下面的2D数组,我希望每个元素都是空的:
static HSM_Transition_T Transition_Table_Array_Test[3][3] = {NULL};
如您所见,我试图等于{NULL}
,但得到以下警告:
警告:(接近“转换表数组测试[0]”的初始化)[-Wmissing大括号]
将每个元素初始化为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主要用于指针,而不是struct
您可能会这样写(注意转换\u表\u数组\u测试之前的“*”):
static HSM_Transition_T *Transition_Table_Array_Test[3][3] = {
{NULL, NULL, NULL},
{NULL, NULL, NULL},
{NULL, NULL, NULL}};
NULL应与指针而不是结构一起使用
如果要初始化二维结构数组中的结构字段,则
static HSM_Transition_T Transition_Table_Array_Test[3][3]={{{NULL,NULL,NULL}}};
得到警告的原因是NULL
是一个原语,但是数组的元素是聚合的;它们需要使用聚合变量(正确的类型)初始化,或者使用第三个大括号表达式(就地构造聚合)初始化
数组的类型不允许使用NULL
来初始化元素,因为结构值不能是NULL
,只能是指针。结构存在于适当的位置,因此它们不可能从数组中“不存在”(数组的元素就是结构;如果数组存在,它们也是)
编译器抱怨大括号仍然丢失,而不是告诉您结构值不能为NULL
,因为它认为您正在尝试初始化HSM\u转换\T
到NULL
(这是一个有意义的操作)中的函数指针[100][100]={{NULL};它工作得很好。你是对的,我也创建了一个,它编译成功,但这是因为你正在使用指针数组进行浮点运算。我的数组是指针结构,它的工作方式不一样,我认为这是因为我仍然得到警告。我编译了你的代码,它工作得很好。从你上次的注释来看,你忘记添加了在HSM_Transition_T
之后加上“*”符号。它应该是HSM_Transition_T*
。这很有效,现在编译起来很好。我选择这个作为答案,因为它实际上显示了第三个括号内的表达式{{{{NULL,NULL,NULL}}需要初始化数组中每个结构中的每个指针。根据Leushenko的回答,我试图对{{NULL}}进行初始化,使结构而不是其内容为NULL。因此,基本上你是说表达式{{NULL}告诉编译器我要初始化数组的每个元素,也就是说,每个结构都为NULL?我需要第三个带括号的表达式,比如{{{NULL,NULL,NULL}}},正如Mac在他的回答中所建议的那样,以指示我试图初始化为NULL的是数组中每个结构中的元素?@m4l490n不完全是。{NULL}
告诉编译器您正试图将struct元素初始化为NULL
,因为该语言实际上允许使用大括号,并尝试根据初始值设定项列表值的类型解释正确的操作过程;因为NULL
无法应用于该结构,所以它尝试将其作为元素读入注释。请参阅第6.7.9节了解详细信息。基本上,编译器是在警告您(注意:它没有给您错误),因为有关不一致支撑的规则非常复杂。特别是警告是要指出,尽管它当前工作正常(因为NULL
无论如何都是零值),如果您尝试使用当前支撑方案添加更多初始值,则最终可能会做一些超出预期的事情。
static HSM_Transition_T Transition_Table_Array_Test[3][3]={{{NULL,NULL,NULL}}};