Seg故障试图在C中分配一个结构数组

时间:2017-11-03 13:36:53

标签: c arrays segmentation-fault

我已经远离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;
}

4 个答案:

答案 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
}

这样,您只能访问数组的元素。 现在,如果您想要为每个结构增加rgb的值,那么您需要做的就是是

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++;
              }
            }
        }