C编译错误:“可变大小的对象可能不会被初始化”

为什么我收到错误“variables大小的对象可能不被初始化”与下面的代码?

int boardAux[length][length] = {{0}}; 

我假设你正在使用C99编译器(支持dynamic大小的数组)。 你的代码中的问题是当编译器看到你的variables声明的时候,它不知道数组中有多less个元素(我也在这里假设,从编译器错误来看,这个length不是一个编译时间常量)。

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

 int boardAux[length][length]; memset( boardAux, 0, length*length*sizeof(int) ); 

您会收到此错误,因为在C语言中不允许使用具有可变长度数组的初始化器。 你得到的错误信息基本上说了这一切。

6.7.8初始化

3要初始化的实体的types应该是未知大小的数组或不是可变长度数组types的对象types。

这给了错误:

 int len; scanf("%d",&len); char str[len]=""; 

这也给错误:

 int len=5; char str[len]=""; 

但是这工作正常:

 int len=5; char str[len]; //so the problem lies with assignment not declaration 

你需要以下面的方式来放置价值:

 str[0]='a'; str[1]='b'; //like that; and not like str="ab"; 

声明数组后

 int boardAux[length][length]; 

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

 int i, j; for (i = 0; i<length; i++) { for (j = 0; j<length; j++) boardAux[i][j] = 0; } 

对于像这样的C ++单独声明和初始化

 int a[n][m] ; a[n][m]= {0}; 

只要声明长度是一个缺点,如果不是,那么你应该dynamic分配内存

你不能做到。 C编译器不能在堆栈上做这么复杂的事情。

你必须使用堆和dynamic分配。

你真的需要做什么:

  • 计算所需内存的大小(n m sizeof(element))
  • 调用malloc(size)来分配内存
  • 创build一个访问器:int * access(ptr,x,y,rowSize){return ptr + y * rowSize + x; }

使用* access(boardAux,x,y,size)= 42与matrix交互。

Interesting Posts