在这种情况下,您不能使用直接数组。可变长度数组只能在本地范围内声明。即如果数组大小是一个运行时值,那么你不能在文件范围内声明这样的数组。所有具有静态存储持续时间的数组都应具有编译时大小。没有办法解决它。
如果您的数组必须在文件范围内声明(顺便说一句,为什么?),您必须改用指针并使用 手动分配内存malloc
,如
int NumOfToys;
struct toy **Square_Toys;
int main()
{
...
/* When the value of `NumOfToys` is already known */
Square_Toys = malloc(NumOfToys * sizeof *Square_Toys);
...
/* When you no longer need it */
free(Square_Toys);
...
}
另一种选择是停止尝试使用文件范围变量并改为切换到本地数组。如果数组大小不是太大,您将能够在本地范围内使用可变长度数组。
第三种选择是一种丑陋的混合方法:声明一个全局指针,但使用本地 VLA 分配内存
int NumOfToys;
struct toy **Square_Toys;
int main()
{
...
/* When the value of `NumOfToys` is already known */
struct toy *Local_Square_Toys[NumOfToys];
Square_Toys = Local_Square_Toys;
...
}
但这仅用于说明目的。这是丑陋的。