创建和返回数组的函数会导致问题

时间:2015-09-27 17:48:19

标签: c arrays function variable-length-array

我尝试编写一个返回像素颜色随机数组的函数,因此当我调用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;
}

2 个答案:

答案 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。但是,如果你不使用动态内存,则无法返回。