Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数组在C中出错:错误被可变地修改_C_Arrays - Fatal编程技术网

数组在C中出错:错误被可变地修改

数组在C中出错:错误被可变地修改,c,arrays,C,Arrays,我在运行代码时遇到此错误: "error: invariably modified 'Square_Toys' at file scope. 在我的代码顶部有一个全局定义的变量,名为NumOfToys,然后在后面定义数组Toy*Square\u Toys[NumOfToys]。NumOfToys取决于用户输入的内容,因此我无法事先定义数组的大小:(。有人对如何消除此错误有任何建议吗 int NumOfToys; <------- This is entered through the u

我在运行代码时遇到此错误:

"error: invariably modified 'Square_Toys' at file scope.
在我的代码顶部有一个全局定义的变量,名为
NumOfToys
,然后在后面定义数组
Toy*Square\u Toys[NumOfToys]
NumOfToys
取决于用户输入的内容,因此我无法事先定义数组的大小:(。有人对如何消除此错误有任何建议吗

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

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

这将有助于实际显示相关代码,而不仅仅是小片段。动态分配数组。您所做的是创建一个
NumOfToys
指针数组。您要做的是
Toy*Square\u Toys=malloc(NumOfToys*sizeof(Toy))
-创建一个
NumOfToys
objects@Smac89<代码> >新的<代码>是C++。问题是“代码>代码< C /代码>。你真的需要一个指针数组来指向代码>结构玩具< /COD>吗?还是你真的想要有一个数组< <代码>结构玩具< /代码>?代码> SIEZOF(玩具)<代码> >代码> sisiof方块玩具[0 ]
。以防类型发生变化。如果我在main函数中这样做并分配内存,但我在main上有调用它的函数,这会给我一个错误,即没有定义Square_Toys,对吗?OP code示例请求指向
Toy
的指针数组,而不是
Toy
的数组。不,您不会得到'Squar'e_Toys not defined'错误,但您应该在使用数组之前对其进行分配。我已根据问题中的新代码段更新了代码。如果我将其放在主函数中,并且在其上有调用它的函数,我将得到一个编译器错误,它的定义不正确。您知道如何使其正确,以便其他函数,而不是物理地将其传递到函数中?我只想分配一个玩具数组,这些玩具稍后将被其他函数访问functions@Masterminder:没错。这意味着您必须将其作为参数传递给其他函数。这是正确的方法。全局变量可能看起来“更容易”,但这确实是一个非常糟糕和懒惰的方法。@Masterminder:如果你想分配一个玩具数组,为什么你问题中的代码示例会声明一个玩具指针数组?我声明一个玩具指针数组,然后稍后会为每个玩具分配内存