我已经远离C了一点,所以这里有一些成长的痛苦。
基本上我试图创建一个包含所有可能RGB值的数组。
#include <stdio.h>
#define MAX 3
struct rgb_val {
int r;
int g;
int b;
};
int main(void) {
struct rgb_val rgb[MAX];
int index = 0;
for (int r = 0; r < MAX; r++) {
for (int g = 0; g < MAX; g++) {
for (int b = 0; b < MAX; b++) {
rgb[index].r = r;
rgb[index].g = g;
rgb[index].b = b;
index++;
}
}
}
return 0;
}
答案 0 :(得分:1)
访问数组越界。它是一个未定义的行为。
答案 1 :(得分:1)
现在,您可以访问数组边界,其大小为MAX。您需要将循环更改为:
int index = 0;
for (int index = 0; index < MAX; index++) {
rgb[index].r = r; //some r
rgb[index].g = g; //some g
rgb[index].b = b; //some b
}
这样,您只能访问数组的元素。
现在,如果您做想要为每个结构增加r
,g
和b
的值,那么您需要做的就是是
rgb[index].r = index;
rgb[index].g = index;
rgb[index].b = index;
答案 2 :(得分:1)
好的,如果你想分配所有可能的组合,那么你需要27个,而不是3个(因为每个可能有3个r / g / b值)。
所以你需要在你的数组中有足够的条目:
struct rgb_val rgb[MAX * MAX * MAX];
现在你的代码正在访问只有3个元素长的数组的索引3,4,... 26,因此是UB。
答案 3 :(得分:0)
我相信你会因为索引数量增加超过MAX而在界外访问数组。
你最好使用:
struct rgb_val rgb[MAX * ((sizeof(rgb_val)/sizeof(int)) * (sizeof(rgb_val)/sizeof(int)))];
int index = 0;
for (int r = 0; r < MAX; r++) {
for (int g = 0; g < MAX; g++) {
for (int b = 0; b < MAX; b++) {
rgb[index].r = r;
rgb[index].g = g;
rgb[index].b = b;
index++;
}
}
}