2013-10-06 10 views
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

这将有助于实际显示相关的代码?而不仅仅是小片段。 – Annabelle

+1

动态分配数组。你所做的是创建一个'NumOfToys'指针数组。你想要做的是'玩具* Square_Toys = malloc(NumOfToys * sizeof(玩具))' - 创建一个'NumOfToys'对象数组 – smac89

+0

@ Smac89'new'只用于C++。这个问题被标记为'c'。 – 2013-10-06 17:14:32

回答

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; 
    ... 
} 

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

+0

如果我把它放在我的主函数中,并且我有上面调用它的函数,那么我会得到一个编译器错误,它没有被定义为正确的?你知道我怎样才能使它可以被其他函数访问,而不需要物理地将它传递给函数? – Masterminder

+0

我只想分配一些其他功能的玩具数组 – Masterminder

+0

@Masterminder:的确如此。这意味着你必须将它传递给其他函数作为参数。这是做到这一点的正确方法。全局变量看起来“更容易”,但它确实是一个非常糟糕和懒惰的出路。 – AnT

0

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

Toy **Square_Toys; 

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

    // do stuff here 

    free(Square_Toys); 
} 
+0

'sizeof(玩具)' - >'sizeof SquareToys [0]'中完成的。如果类型改变了。 – 2013-10-06 17:15:18

+0

如果我在主函数中这样做,并分配内存,但我有主函数调用它的函数,它会给我一个Square_Toys没有定义的错误,是正确的吗? – Masterminder

+0

OP代码示例向“玩具”请求*指针*数组,而不是“玩具”数组。 – AnT

0

NumOfToys取决于什么用户输入,所以我不能定义数组事先

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

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

struct toy * Square_Toys[NumOfToys];