在 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 中初始化指针数组 - 可变大小的对象可能未初始化的主要内容,如果未能解决你的问题,请参考以下文章