我有这些结构定义

typedef struct my_s {
   int x;
   int y;
} my_T;

typedef struct your_s {
    my_T * x;
} your_T;

your_T array[MAX_COL][MAX_ROW];

要将数组的指针初始化为 NULL,我可以这样做:

memset (array, 0, sizeof(array))

这对我来说不合适。


最简单的是

your_T array[MAX_COL][MAX_ROW] = {{{0}}};

typedef struct my_s {
   int x;
   int y;
} my_T;

typedef struct your_s {
    my_T * x;
} your_T;

your_T array[MAX_COL][MAX_ROW];

您不能使用 memset 将 your_T 的指针初始化为空,因为没有指定空指针的位模式全部由空位组成。但是您可以像这样创建数组:

your_T array[MAX_COL][MAX_ROW] = {{}};

元素将被默认初始化,这意味着对于一个指针,该指针将包含一个空指针值。如果你的数组是全局的,你甚至不必关心。那将默认发生。


不应该是“your_T array[MAX_ROW][MAX_COL];” 因为 C++ 中的数组是行优先顺序?

+1,只是为了澄清,这是有效的,因为所有未显式初始化的成员都将设置为 0,这是一个空指针。

嗯,尝试这个,编译器给出了警告:在数组 [0][0] 附近的初始化程序周围缺少大括号,我的警告被视为错误。

抱歉,忘记了第三副牙套。结构数组的数组。

感谢您的信息。我知道什么时候是全局的,它默认为 NULL,但我想确保它是 NULL-ed,因为我在嵌入式空间中运行......

那么你就可以使用 {{}} 了。缩进是一个实现可以在指针中存储一个不同于 0x0 的值,当随后对该内存单元的读取取消引用时,可能会导致生成陷阱。因此,空指针中的 0x0 位模式不是必需的。

+1。空括号初始化在 C 中是非法的,但正如我刚刚了解到的,在 C++ 中是合法的,这是一个常见/有用的结构吗?