如果 MSVC 不支持 VLA,但您的代码希望将 arr 索引为 arr[i][j],那么您将获得创意。
如果您的数组内容需要是连续的,那么您需要分配一个后备存储:
int *store = malloc( dim * dim * sizeof *store );
然后将arr 作为指针数组分配到该存储中:
int **arr = malloc( dim * sizeof *arr );
for ( size_t i = 0; i < dim; i++ )
arr[i] = store + i * dim;
这给了我们这样的东西:
int ** int * int
+---+ +---+ +---+
arr: | | ---> | | arr[0] ---------> | | arr[0][0] (store[0])
+---+ +---+ +---+
| | arr[1] -------+ | | arr[0][1] (store[1])
+---+ | +---+
... | ...
+---+ | +---+
| | arr[dim-1] -+ | | | arr[0][dim-1] (store[dim-1])
+---+ | | +---+
| +-> | | arr[1][0] (store[dim])
| +---+
| | | arr[1][1] (store[dim+1])
| +---+
| ...
| +---+
| | | arr[1][dim-1] (store[dim+dim-1])
| +---+
| ...
| +---+
+---> | | arr[dim-1][0] (store[dim*(dim-1)])
+---+
| | arr[dim-1][1] (store[dim*(dim-1)+1]
+---+
如果你的数组不需要是连续的,你可以做一个“锯齿状”分配:
int **arr = malloc( dim * sizeof *arr ); // allocates your "columns"
if ( arr )
{
size_t i;
for ( i = 0; i < dim; i++ )
{
arr[i] = malloc( dim * sizeof *arr[i] ); // allocates your "rows"
}
}
arr 是指向int * 的dim 元素数组的指针,每个arr[i] 都是指向dim 元素数组int 的指针,给你这样的东西:
int ** int * int
+---+ +---+ +---+
arr: | | ----> | | arr[0] ------------> | | arr[0][0]
+---+ +---+ +---+
| | arr[1] ----------+ | | arr[0][1]
+---+ | +---+
... | ...
|
| +---+
+-> | | arr[1][0]
+---+
| | arr[1][1]
+---+
...
请注意,如果您将arr 传递给任何函数,则相应的函数参数必须具有int ** 类型,而不是int (*)[dim] 或int [][dim] 或int [dim][dim]。