我尝试编写一个返回像素颜色随机数组的函数,因此当我调用randomPalette(i)
时,该函数将创建一个i
颜色的随机数组。以下是我的代码。它表示random[colors]
处的错误表达式必须具有常量值。我不知道为什么。如何解决?
pixel* randomPalette(int colors){
pixel random[colors] ;
int i, x;
srand(time(NULL)); //generate a random seed
for (i = 0; i < colors; i++){
x = rand() % 256;
random[i].r = x; random[i].g = x; random[i].b = x;
}
return random;
}
答案 0 :(得分:6)
在您的代码中,首先
pixel random[colors] ;
语法称为variable length array a.k.a VLA,仅在C99
上和之后支持。如果您希望这样做,您需要强制您的编译器使用C99
模式,就像gcc
一样,您需要使用--std=C99
编译器选项。
其次,random
是一个自动本地变量,您正在尝试return
(地址)。如果正在使用返回的值,则您将调用undefined behavior。
解决方案:使用指针和动态内存分配,如malloc()
和family。动态分配的内存生存期保持活动状态,直到通过调用free()
手动释放,因此您可以从函数返回指针并在调用者中使用它。
答案 1 :(得分:3)
以下是我的代码。它表示错误随机[颜色]表达式 必须具有恒定的价值。我不知道为什么。如何解决?
显然,您不支持可变长度数组。要么使用下面的固定整数(例如#define
或const整数)而不是colors
:
pixel random[colors] ;
或动态分配内存。 e.g。
pixel *random = malloc (sizeof(pixel) * colors);
但如果您使用上述方法,请不要忘记free
。
最后,你不能这样做:
return random;
因为你要将地址返回到局部变量,当函数结束时它将超出范围。实际上,如果使用动态内存分配(例如random
)对其进行初始化,则可以返回malloc
。但是,如果你不使用动态内存,则无法返回。