【问题标题】:Initialized a pointer array in C - Variable sized object may not be initialized在 C 中初始化指针数组 - 可变大小的对象可能未初始化
【发布时间】: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 谢谢队友

标签: arrays c pointers struct initialization


【解决方案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
    猜你喜欢
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多