C - 没有常数的二维数组

时间:2014-05-22 12:00:18

标签: c arrays visual-studio constants

我有一个学校项目,我必须创建一个带有二维数组的游戏,行和列会发生变化。 所以我想要的是询问用户的行数和列数,然后创建游戏板。 因此,如果用户说出6行和10列,我将其保存在两个变量中,然后我将创建二维数组。 这里的问题是Visual Studio说我必须有恒定的值,有一种方法可以制作一个没有常数的二维数组吗? 谢谢你的帮助。

3 个答案:

答案 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标准。