【问题标题】:Segmentaion fault calling method the second time C++第二次C++分段错误调用方法
【发布时间】:2013-03-07 20:23:28
【问题描述】:

如果我向 setColor 添加第二个调用,则会出现分段错误。我认为该方法可能会以某种方式更改数组指针,但我不确定为什么。

#include <iostream>

using namespace std;

struct Color {
    int red;
    int blue;
    int green;
};

void setColor(Color **arr, int index, int red, int blue, int green) {
    Color *ptr = arr[index];
    (*ptr).red = red;
    (*ptr).blue = blue;
    (*ptr).green = green;
}

int main() { 
    Color *arr[3];
    setColor(arr, 0, 12, 23, 34);

    return 0;
}

【问题讨论】:

  • 你可能想要一些实际的对象在那些不确定的指针后面。
  • 为什么有这么多指针?所有那些尖尖的星星都刺痛了我的眼睛。
  • 您正在为 Color*(在 arr 中)而不是目标 Color 对象分配内存。我很惊讶这甚至可以工作一次。
  • 您必须先分配一个变量值,然后才能使用该值。您创建了一个名为 arr[0] 的变量,它没有特定的值,然后您尝试通过取消引用来使用该值。不好。
  • 这三个指针指向任何地方。通过它们访问数据将导致未定义的行为。

标签: c++ methods fault


【解决方案1】:

arr 是一个未初始化的指针数组。你很“幸运”它完全可以工作,因为你调用了未定义的行为

【讨论】:

    【解决方案2】:

    您已经声明了一个指向颜色的指针数组,但没有留出任何内存供它使用。这是未定义的行为。作为未定义的行为,你不能说会发生什么。如果你继续运行它,你可能会从中得到一杯咖啡!

    为了使这个答案值得保留,您所说明的确切场景称为取消引用 wild pointer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 2018-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多