C编译错误:“可变大小的对象可能不初始化”
-
28-09-2019 - |
题
为什么我会在以下代码中收到错误“可能不会初始化的变量大小对象”?
int boardAux[length][length] = {{0}};
解决方案
我假设您正在使用C99编译器(支持动态尺寸的数组)。代码中的问题是,当编译器看到您的变量声明时,它不知道该数组中有多少个元素 length
不是编译时间常数)。
您必须手动初始化该数组:
int boardAux[length][length];
memset( boardAux, 0, length*length*sizeof(int) );
其他提示
您会收到此错误,因为在C语言中,您不允许使用具有可变长度数组的初始化器。您收到的错误消息基本上说明了一切。
6.7.8初始化
...
3要初始化的实体的类型应为未知大小或不是可变长度数组类型的对象类型的数组。
这给出了错误:
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];
将初始值分配为零是用于循环的最简单方法,即使它可能有点冗长
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};
你做不到。 C编译器无法在堆栈上做这样复杂的事情。
您必须使用堆和动态分配。
您真正需要做的事情:
- 计算尺寸(nm您需要的内存的大小(元素))
- 致电malloc(大小)分配内存
- 创建一个访问者:int* access(ptr,x,y,rowsize){return ptr + y* rowsize + x; }
使用 *Access(Boardaux,X,Y,Size)= 42与矩阵交互。
不隶属于 StackOverflow