我有一个学校项目,我必须创建一个带有二维数组的游戏,行和列会发生变化。 所以我想要的是询问用户的行数和列数,然后创建游戏板。 因此,如果用户说出6行和10列,我将其保存在两个变量中,然后我将创建二维数组。 这里的问题是Visual Studio说我必须有恒定的值,有一种方法可以制作一个没有常数的二维数组吗? 谢谢你的帮助。
答案 0 :(得分:2)
使用编译器,您必须使用malloc来分配数组。虽然当int[x][y]
或x
不是编译时常量时,C99支持y
语法,但Visual Studio不支持。{/ p>
像这样分配你的数组:
int* ar = malloc(sizeof(int) * x * y);
然后你可以像这样使用它:
int getIndex(int* array, int col, int row){
return ar[row*y+col];
}
当然,您必须将y
存储在某处,以便您可以将其用于索引计算(如getInt
示例函数中所示。例如,您可以包装{{1}指向数组的指针和int*
到结构中,并始终传递此结构。
答案 1 :(得分:2)
如果要对动态二维数组使用普通数组索引:
int* array_mem = malloc( sizeof(*array_mem) * x * y ) ;
int** array = malloc( sizeof(*array) * x ) ;
int i = 0;
for( i = 0; i < x; i++ )
{
array[i] = &array_mem[i * y] ;
}
array
并被索引为二维数组,例如array[0][5]
,并且共享与普通数组相同的连续内存属性。但是sizeof(array)
不会像正常数组一样返回已分配内存的大小。
请注意,在这种情况下,您负责在完成后将内存返回到堆 - 除了在进程终止之外,它不会自动执行此操作。
如果你没有在课堂上介绍动态内存或指针,你可能最好使用更简单的替代解决方案,例如简单地创建一个足够大的数组,以满足用户要求的最大尺寸(并包括一些范围检查输入)。
答案 2 :(得分:1)
你得到这个答案,因为你使用的是一个糟糕的非标准编译器。你的问题的解决方案是在一个好的编译器上编译你的C代码。
代码如int arr[x][y];
,其中x和y是普通的int变量,完全没问题。
这称为可变长度数组(VLA)。 Visual Studio不知道这一点,因为它不符合C标准。