运行代码时出现此错误:
"error: invariably modified 'Square_Toys' at file scope.
在我的代码顶部有一个名为NumOfToys
的全局定义的变量,然后我在之后定义了我的数组Toy* Square_Toys[NumOfToys]
。 NumOfToys
取决于用户输入的内容,因此我无法预先定义数组的大小:(。有没有人有任何建议我如何摆脱这个错误?
int NumOfToys; <------- This is entered through the user running the programin the terminal
struct toy * Square_Toys[NumOfToys];
答案 0 :(得分:2)
在这种情况下,您无法使用直接数组。可变长度数组只能在本地范围内声明。即如果数组大小是运行时值,则无法在文件范围中声明此类数组。具有静态存储持续时间的所有阵列都应具有编译时大小。没有办法解决它。
如果您的数组必须在文件范围内声明(BTW,为什么?),则必须使用指针代替并使用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;
...
}
但这只是为了说明目的。这太丑了。
答案 1 :(得分:0)
全局数组的大小应该是常量,因为编译器需要在编译时知道它。如果需要动态数组,请在运行时使用malloc分配它:
Toy **Square_Toys;
void foo(void) {
Square_Toys = malloc(NumOfToys * sizeof(Toy*));
// do stuff here
free(Square_Toys);
}
答案 2 :(得分:0)
NumOfToys
取决于用户输入的内容,因此我无法预先定义数组的大小
您可以为阵列动态分配空间或使用VLA。对于VLA,用户输入NumOfToys
后会在main
中声明您的数组。
printf("Enter number of toys: ");
scanf("%d", &NumOfToys);
struct toy * Square_Toys[NumOfToys];