Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中将指针结构的2D数组初始化为NULL?_C_Arrays_Struct - Fatal编程技术网

如何在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}}};