[英]Error in C for Array: error variably modified
运行代码时出现此错误:
"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];
在这种情况下,您不能使用直接数组。 可变长度数组只能在本地范围内声明。 即,如果数组大小是运行时值,则无法在文件范围内声明该数组。 具有静态存储持续时间的所有阵列应具有编译时大小。 没有办法解决。
如果必须在文件范围内声明数组(顺便说一句,为什么?),则必须使用指针代替,并使用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;
...
}
但这只是出于说明目的。 这很丑。
全局数组的大小应为常数,因为编译器需要在编译时就知道它。 如果需要动态数组,请在运行时使用malloc分配它:
Toy **Square_Toys;
void foo(void) {
Square_Toys = malloc(NumOfToys * sizeof(Toy*));
// do stuff here
free(Square_Toys);
}
NumOfToys
取决于用户输入的内容,因此我无法预先定义数组的大小
您可以为数组动态分配空间,也可以使用VLA。 对于VLA,用户输入后NumOfToys
声明在你的阵列main
。
printf("Enter number of toys: ");
scanf("%d", &NumOfToys);
struct toy * Square_Toys[NumOfToys];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.