C编译错误:"可能无法初始化可变大小的对象"

hel*_*rld 83 c compiler-errors initializer-list variable-length-array

为什么我使用以下代码收到错误"可能无法初始化可变大小的对象"?

int boardAux[length][length] = {{0}};
Run Code Online (Sandbox Code Playgroud)

Dav*_*eas 100

我假设您使用的是C99编译器(支持动态大小的数组).你的代码中的问题是,当编译器看到你的变量声明时,它不知道数组中有多少元素(我也在这里假设,编译器错误length不是编译时常量).

您必须手动初始化该数组:

int boardAux[length][length];
memset( boardAux, 0, length*length*sizeof(int) );
Run Code Online (Sandbox Code Playgroud)

  • @mazend 因为内存已在第 1 行的堆栈上分配。 Malloc 在堆上分配内存。 (2认同)

AnT*_*AnT 24

您收到此错误,因为在C语言中,您不能使用具有可变长度数组的初始化程序.你得到的错误信息基本上都说明了一切.

6.7.8初始化

...

3要初始化的实体的类型应为未知大小的数组或不是可变长度数组类型的对象类型.

  • 如果您只提供非正式的解释,有些主题会让您不相信.可变长度数组是这些主题之一.+1引用标准. (3认同)
  • @helloWorld:这是来自语言标准(C99)。您可以在此处获取包含 TC3 更新的“工作”副本 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (2认同)
  • @Abhishek Mane:不。C++ 根本没有可变大小的数组。 (2认同)

Ami*_*jan 12

这给出了错误:

int len;
scanf("%d",&len);
char str[len]="";
Run Code Online (Sandbox Code Playgroud)

这也会出错:

int len=5;
char str[len]="";
Run Code Online (Sandbox Code Playgroud)

但这很好用:

int len=5;
char str[len]; //so the problem lies with assignment not declaration
Run Code Online (Sandbox Code Playgroud)

您需要以下列方式放置值:

str[0]='a';
str[1]='b'; //like that; and not like str="ab";
Run Code Online (Sandbox Code Playgroud)


小智 5

声明数组后

int boardAux[length][length];
Run Code Online (Sandbox Code Playgroud)

将初始值分配为零的最简单方法是使用 for 循环,即使它可能有点长

int i, j;
for (i = 0; i<length; i++)
{
    for (j = 0; j<length; j++)
        boardAux[i][j] = 0;
}
Run Code Online (Sandbox Code Playgroud)

  • `memset` 更简单、更快。 (8认同)

Osk*_*son 5

变长数组是编译器在编译时不知道其长度的数组。在你的情况下length是一个变量。我得出这样的结论,因为如果length将例如预处理器宏定义为文字整数,则初始化将起作用。1989 年的第一个 C 语言标准不允许可变长度数组,它们是在 1999 年添加的。 C 标准仍然不允许使用像您这样的表达式来初始化它们(尽管有人可能会认为它可以或应该允许)。

初始化变量数组的最佳方法是这样的:

int boardAux[length][length];
memset( boardAux, 0, sizeof(boardAux) );
Run Code Online (Sandbox Code Playgroud)

memset是一个非常快速的标准库函数,用于初始化内存(在上述情况下初始化为 0)。sizeof(boardAux)返回 所占用的字节数boardAuxsizeof始终可用,但memset需要#include <string.h>. 是的 -sizeof允许可变大小的对象作为参数。

请注意,如果您有一个普通数组(不是可变长度)并且只想将内存初始化为零,则您永远不需要嵌套括号,您可以像这样简单地初始化它:

struct whatEver name[13][25] = {0};
Run Code Online (Sandbox Code Playgroud)