创建和返回数组的函数会导致问题
我试着编写一个返回像素颜色随机数组的函数,所以当我调用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
。 但是如果你不使用动态内存,则无法返回。