C中的数组错误:可变修改错误[重复]

5tmbdcev  于 2023-08-03  发布在  其他
关注(0)|答案(3)|浏览(92)

此问题在此处已有答案

Variably modified array at file scope in C(4个答案)
4天前关闭。
当我运行代码时,我得到这个错误:
错误:总是修改'Square_Toys'在文件范围.
在我的代码顶部有一个全局定义的变量,名为NumOfToys,然后我在它后面定义了我的数组Toy* Square_Toys[NumOfToys]NumOfToys取决于用户输入的内容,所以我不能预先定义数组的大小:(
我如何才能摆脱这个错误?

int NumOfToys; // <------- This is entered through the user running the programin the terminal
struct toy * Square_Toys[NumOfToys];

字符串

qrjkbowd

qrjkbowd1#

在这种情况下不能使用直接数组。可变长度数组只能在局部范围内声明。也就是说,如果数组大小是一个运行时值,那么你不能在文件范围内声明这样的数组。所有具有静态存储持续时间的数组都应具有编译时大小。没办法了
如果你的数组必须在文件作用域中声明(顺便说一句,为什么?),则必须使用指针,并使用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;
  ...
}


但这里只是为了说明的目的。是很丑

8yoxcaq7

8yoxcaq72#

NumOfToys取决于用户输入的内容,因此我无法预先定义数组的大小
您可以动态地为数组分配空间或使用VLA。对于VLA,在用户输入NumOfToys后,在main中声明数组。

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

struct toy * Square_Toys[NumOfToys];

字符串

kxxlusnw

kxxlusnw3#

全局数组的大小应该是常量,因为编译器需要在编译时知道它。如果你需要一个动态数组,在运行时用malloc分配它:

Toy **Square_Toys;

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

  // do stuff here

  free(Square_Toys);
}

字符串

相关问题