int array[5][3];
(显然)创建了一个 5 x 3 的多维 C 数组。但是,
int x = 5;
int array[x][3];
没有。_ 我一直以为会。我对 C 数组有什么不了解的地方?如果他们只允许一个常量来定义 C 数组的长度,有没有办法以某种方式解决这个问题?
int array[5][3];
(显然)创建了一个 5 x 3 的多维 C 数组。但是,
int x = 5;
int array[x][3];
没有。_ 我一直以为会。我对 C 数组有什么不了解的地方?如果他们只允许一个常量来定义 C 数组的长度,有没有办法以某种方式解决这个问题?
在 ANSI C(又名 C89)中,所有数组维度都必须是编译时整数常量(这不包括声明为 的变量const
)。extern
一个例外是,在某些上下文中,例如函数参数、声明和初始化,第一个数组维度可以写为一组空括号。例如:
// The first parameter is a pointer to an array of char with 5 columns and an
// unknown number of rows. It's equivalent to 'char (*array_param)[5]', i.e.
// "pointer to array 5 of char" (this only applies to function parameters).
void some_function(char array_param[][5])
{
array_param[2][3] = 'c'; // Accesses the (2*5 + 3)rd element
}
// Declare a global 2D array with 5 columns and an unknown number of rows
extern char global_array[][5];
// Declare a 3x2 array. The first dimension is determined by the number of
// initializer elements
int my_array[][2] = {{1, 2}, {3, 4}, {5, 6}};
C99 添加了一个新特性,称为可变长度数组(VLA),其中第一个维度允许为非常量,但仅适用于在堆栈上声明的数组(即具有自动存储功能的数组)。全局数组(即具有静态存储的数组)不能是 VLA。例如:
void some_function(int x)
{
// Declare VLA on the stack with x rows and 5 columns. If the allocation
// fails because there's not enough stack space, the behavior is undefined.
// You'll probably crash with a segmentation fault/access violation, but
// when and where could be unpredictable.
int my_vla[x][5];
}
请注意,最新版本的 C 标准 C11 使 VLA 成为可选的。Objective-C 基于 C99 并支持 VLA。C++ 没有VLA,尽管许多 C/C++ 编译器(例如 g++)在其 C 实现中支持 VLA,但也支持 C++ 中的 VLA 作为扩展。
int x = 5;
int array[x][3];
是的,它确实。这是一个 C99 可变长度数组。请务必切换到 C99 模式,并确保已array
在块或函数范围内声明。不能在文件范围内声明可变长度数组。
尝试:
const int x=5;
int array[x][3];
正如你所说的x必须是一个常数,否则想想如果在程序中间你改变x的值会发生什么,数组的维度是多少:(
但是,如果您更改 x 的值,则通过将其声明为常量,您会收到编译错误。