繁体   English   中英

数组C的错误:可变地修改了错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM