在 C 中初始化指针数组 - 可变大小的对象可能未初始化

Posted

技术标签:

【中文标题】在 C 中初始化指针数组 - 可变大小的对象可能未初始化【英文标题】:Initialized a pointer array in C - Variable sized object may not be initialized 【发布时间】:2021-07-19 03:15:51 【问题描述】:

我试图初始化一个由指针组成的数组:

我使用的代码是:

int c = 15;
Struct *Pointer[c] = NULL;

但是 C 给了我一条错误消息,上面写着:

"message": "variable-sized object may not be initialized",

但是当我将代码更改为:

Struct *Pointer[15] = NULL;

成功了!

有什么办法可以解决吗?我不能用 15 代替变量“c”

干杯!

【问题讨论】:

就像它说的那样,如果数组大小不是恒定的,则不能使用初始化程序。您必须编写一个循环:for (int i = 0; i < c; i++) Pointer[i]=NULL;。或者,如果您的平台将 NULL 指针设为全位为零(大多数情况下如此),则使用 memset @NateEldredge 谢谢 Nate - 我试过 memset,它成功了!!谢谢 - 我不明白的一件事,即使我将 C 设为 Const int,它仍然不起作用。这正常吗? 是的,这很正常。只是 C 处理 const 的某种特殊方式的一部分。 C++ 不同。 @NateEldredge 谢谢队友 【参考方案1】:

你需要做一个循环来初始化数组:

for (int i = 0; i < c; i++)
    Pointer[i] = NULL; // set all of these values to NULL

现在,Pointer 的大小将变为 c

此外,此链接也可能有所帮助:Array[n] vs Array[10] - Initializing array with variable vs real number

【讨论】:

【参考方案2】:

可变长度数组不能在其声明中初始化。

可以使用标准的字符串函数memset来初始化变长数组占用的内存。

例如

#include <string.h>

//...

int c = 15;
Struct *Pointer[c];

memset( Pointer, 0, c * sizeof( *Pointer ) );

请注意,可变长度数组应具有自动存储持续时间,即它们可以在函数中声明并且可能没有存储说明符static

【讨论】:

嘿,弗拉德 - 我认为你是对的 - 通过使用 memset(),它以某种方式初始化了另一个数组....有没有办法修复它? @leo:如果你正确使用memset,就不会发生这种情况,所以你一定有一个错误。您可以将其作为一个新问题提出,但请务必包含 minimal reproducible example。

以上是关于在 C 中初始化指针数组 - 可变大小的对象可能未初始化的主要内容,如果未能解决你的问题,请参考以下文章

使用 memset 防止“可变大小的对象可能未初始化”

可能无法初始化C ++可变大小的对象

变量初始化错误c ++

C中指向可变长度数组的指针的类型是啥?

C语言野指针就是未初始化的指针么

如何将可变大小的 void 指针存储在一个指针数组中?