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

Posted

技术标签:

【中文标题】使用 memset 防止“可变大小的对象可能未初始化”【英文标题】:Use of memset to prevent ''variable-sized object may not be initialized' 【发布时间】:2017-01-07 22:11:16 【问题描述】:

我正在尝试使用下面的代码将值设置为 2D 数组(设想游戏板或某个网格),但我收到“可变大小的对象可能未初始化”错误。

我尝试使用 memset 解决它,但无济于事。

非常感谢和一些提示将不胜感激。


// constants
#define DIM_MIN 3
#define DIM_MAX 9

// board
int board[DIM_MAX][DIM_MAX];


void init(void)

  int highest = d^2;

  for (int i = 0; i < d; i++)
    
        for (int j = 0; j < d; j++)
        
            int board[i][j] = highest - 1;
        
    
    if (d % 2 == 0)
    
        int board[d-1][d-2] = 2;
        int board[d-1][d-3] = 1;
        

【问题讨论】:

您告诉我们memset,但不费心向我们展示您是如何使用它的? 奇怪的是,你把int放在前面声明的board的前面,但是d还是未知的。 另外,d^2 也不是解决d 的方法。请改用d*d @BoPersson 非常感谢 【参考方案1】:

问题在于for 循环体中的代码

  int board[i][j] = highest - 1;

你想要的可能是

  board[i][j] = highest - 1;

if 条件体也是如此。

为了详细说明错误消息,int board[i][j] = highest - 1; 尝试定义一个无法初始化的新 VLA (variable length array)。

引用C11,第 6.7.9 章,初始化强调我的

要初始化的实体的类型应该是一个未知大小的数组或者一个完整的 不是可变长度数组类型的对象类型。

【讨论】:

亲爱的 Sourav,非常感谢。我现在明白了,也谢谢你的出处。

以上是关于使用 memset 防止“可变大小的对象可能未初始化”的主要内容,如果未能解决你的问题,请参考以下文章

变量初始化错误c ++

将“整数字符串”转换为整数数组

性能杀手:”潜伏”的memset

MSVC(和 icc)自动调用 memset C++

memset使用技巧

使用 memset 设置数组