1

运行代码时出现此错误:

"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];
4

3 回答 3

2

在这种情况下,您不能使用直接数组。可变长度数组只能在本地范围内声明。即如果数组大小是一个运行时值,那么你不能在文件范围内声明这样的数组。所有具有静态存储持续时间的数组都应具有编译时大小。没有办法解决它。

如果您的数组必须在文件范围内声明(顺便说一句,为什么?),您必须改用指针并使用 手动分配内存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;
  ...
}

但这仅用于说明目的。这是丑陋的。

于 2013-10-06T17:13:31.603 回答
0

全局数组的大小应该是恒定的,因为编译器需要在编译时知道它。如果您需要动态数组,请在运行时使用 malloc 分配它:

Toy **Square_Toys;

void foo(void) {
  Square_Toys = malloc(NumOfToys * sizeof(Toy*));

  // do stuff here

  free(Square_Toys);
}
于 2013-10-06T17:14:20.053 回答
0

NumOfToys取决于用户输入的内容,因此我无法事先定义数组的大小

您可以为阵列动态分配空间或使用 VLA。对于 VLA,在用户输入后NumOfToys声明您的数组在main.

printf("Enter number of toys: ");
scanf("%d", &NumOfToys);

struct toy * Square_Toys[NumOfToys];    
于 2013-10-06T17:15:02.000 回答