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

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

在您的代码中,首先

 pixel random[colors] ; 

语法称为可变长度数组,也称为VLA,仅在C99上和上方支持。 如果你想让它工作,你需要强制你的编译器使用C99模式,就像gcc ,你需要使用--std=C99编译器选项。

其次, random是一个自动局部变量,你试图return它的地址。 如果正在使用返回的值,则将调用未定义的行为 。

解决方案:使用指针和动态内存分配,如malloc()和family。 动态分配的内存生存期保持活动状态,直到通过调用free()手动释放,因此您可以从函数返回指针并在调用者中使用它。

以下是我的代码。 它表示随机[颜色]的错误表达式必须具有恒定值。 我不知道为什么。 怎么解决?

显然,您不支持可变长度数组。 要么使用下面的固定整数(例如#define或const integer)而不是colors

 pixel random[colors] ; 

或动态分配内存。 例如

 pixel *random = malloc (sizeof(pixel) * colors); 

但如果您使用上述方法,请不要忘记free


最后,你不能这样做:

 return random; 

因为你将地址返回到局部变量,当函数结束时它将超出范围。 实际上,如果使用动态内存分配(例如malloc初始化它,则可以返回random 。 但是如果你不使用动态内存,则无法返回。