2010-05-10 77 views
6

我是C编程新手。我正在尝试使用变量设置数组的大小,但出现错误:“数组”的存储大小不是固定的 !!c数组:动态设置大小?

01 int bound = bound*4; 

02 static GLubyte vertsArray[bound]; 

我注意到,当我更换用数字(上线02括号内)说,“20”,该计划将没有问题运行。但我试图设置动态数组的大小...

任何想法,为什么我得到这个错误? 感谢多,

回答

5

要创建一个非恒定的大小(即,在编译时已知)的阵列,则需要将其使用malloc()(以及相应使用free()当它不再需要释放它),用于动态地分配空间。

正如其他人已经指出的那样,在符合C99的编译器中可以声明动态数组。

11

你会得到这个错误,因为正如编译器告诉你的那样,你的数组大小不是恒定的。在C89/90版本的C语言中,数组的大小必须是一个常数。你不能“动态设置数组的大小”。如果您需要运行时大小的阵列,则必须使用malloc手动分配或使用某种非标准编译器特定的方法(如alloca函数)。

在C99版本的C语言中增加了对所谓可变长度数组(VLA)的支持。 C99编译器会接受自动阵列的运行时大小的数组声明。但是,即使在C99中,您也不能像正在尝试的那样声明静态阵列的运行时大小。

3

你想要什么是可能在C99;然而,对于早期版本的C,你坚持调用函数来动态分配内存,例如alloca(3)malloc(3)

-3

使用以下两种

GLubyte* vertsArray = (GLubyte*) malloc(sizeof(GLubyte) * bound); 

GLubyte* vertsArray = new GLubyte[bound]; 

记得释放内存的时候,你不需要再对象

delete [] vertsArray; 

free((void*)vertsArray; 

尽管他们在评论中说的话我还是说,你应该更喜欢而不是malloc如果你不是100%被迫使用C.看到这link for more information

+2

错误的语言 - 这是一个C问题。 :) – Arafangion 2010-05-10 06:02:12

+0

虽然malloc和free方法是针对C的,为此我说只有在支持时才使用new/delete ... – 2010-05-10 06:05:00

+6

如果你的编译器支持'new' /'delete',它是一个C++编译器,而不是C编译器。你真的不应该使用C++编译器来编译C代码,原因有很多。你不应该鼓励使用C的人使用C++,“如果他们的编译器支持它的话。” – 2010-05-10 06:07:02