C表示阵列错误:错误已修改

时间:2013-10-06 17:07:45

标签: c arrays

运行代码时出现此错误:

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

3 个答案:

答案 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];