【问题标题】:Seg fault trying to assign an array of structs in C尝试在 C 中分配结构数组的段错误
【发布时间】:2017-11-03 13:36:52
【问题描述】:

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

【问题讨论】:

  • "我已经远离 C ..." 你的错误与 C 完全无关 ...
  • 请阅读How to Ask 并按照说明进行操作。
  • 你真的认为只有 3 个不同的 RGB 值吗?

标签: c arrays segmentation-fault


【解决方案1】:

访问数组越界。这是一种未定义的行为。

【讨论】:

    【解决方案2】:

    现在,您可以访问数组的边界,其大小为 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;  
    

    【讨论】:

      【解决方案3】:

      好吧,如果你想分配所有可能的组合,那么你需要 27 个,而不是 3 个(因为每个有 3 个可能的 r/g/b 值)。

      所以你需要在你的数组中有足够的条目:

      struct rgb_val rgb[MAX * MAX * MAX];
      

      现在您的代码正在访问只有 3 个元素长的数组的索引 3、4、...26,因此是 UB。

      【讨论】:

      • 这样做会造成另一个段错误,即使我删除了所有其他代码。
      【解决方案4】:

      我相信由于将索引计数增加到超过 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++;
                    }
                  }
              }
      

      【讨论】:

      • index++ 被执行MAX*MAX*MAX 次而不是MAX * (sizeof(rgb_val)/sizeof(int)) 次。
      • 你说得对,已编辑。我使用了 sizeof 以便以后可以轻松添加额外的整数。
      • 为什么在计算数组大小时使用异或?
      • C 中没有 "to the power of" 运算符。在 C 中,^ 是 xor 运算符。
      • 又改了,不知道在想什么
      猜你喜欢
      • 2021-06-24
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      • 2018-08-21
      • 2018-01-29
      • 1970-01-01
      • 2021-07-15
      • 1970-01-01
      相关资源
      最近更新 更多