C ++在构造函数EXC_BAD_ACCESS中初始化数组

时间:2011-11-21 17:43:04

标签: c++ arrays constructor initialization exc-bad-access

我正在创建一个简单的构造函数并初始化一个数组:

// Construtor
Cinema::Cinema(){
    // Initalize reservations
    for(int i = 0; i < 18; i++){
        for(int j = 0; j < 12; j++){
            setReservation(i, j, 0);
        }
    }

    // Set default name
    setMovieName("N/A");

    // Set default price
    setPrice(8);
}

setReservation函数:

void Cinema::setReservation(int row, int column, int reservation){
    this->reservations[row][column] = reservation;
}

setMovieName函数:

void Cinema::setMovieName(std::string movieName){
    this->movieName = movieName;
}

由于某些奇怪的原因,当我运行程序时,setMovieName函数会出现以下错误:“Program Received Signal:EXC_BAD_ACCESS”

如果我取出初始化预订数组的for循环,问题就会消失,电影名称设置没有任何问题。知道我做错了吗?

这是Cinema.h文件:

#ifndef Cinema_h
#define Cinema_h

class Cinema{

private:
    int reservations[17][11];
    std::string movieName;
    float price;
public:
    // Construtor
    Cinema();

    // getters/setters
    int getReservation(int row, int column);
    int getNumReservations();
    std::string getMovieName();
    float getPrice();

    void setReservation(int row, int column, int reservation);
    void setMovieName(std::string movieName);
    void setPrice(float price);
};

#endif

5 个答案:

答案 0 :(得分:2)

如果应该有18行和12列,那就是你需要对数组进行维度的方式:

int reservations[18][12];

最好还是使用静态常量,而不是“魔术数字”。此外,行和列很容易混淆,因此更好的想法是为迭代变量ij提供更具描述性的名称。

class Cinema
{
    static const int row_count = 18;
    static const int column_count = 12;

    int reservations[row_count][column_count];

    //looping
    Cinema() {
      for (int row = 0; row < row_count; ++row) {
        for (int column = 0; column < column_count; ++column {
            ...
        }
      }
    }

};

答案 1 :(得分:1)

您是在某处初始化this->reservations还是静态?另外,尺寸是否正确?看到它的定义很重要。否则可能就是原因。如果这不能解决您的问题,请设置一个断点,然后逐步执行代码,以查看失败的行。

答案 2 :(得分:1)

您实际上是在为预订分配空间吗?

如果它是固定大小,您是否将其声明为int[18][12]

如果没有,请不要使用int**。这是c ++,你可以使用

std::vector<std::vector<int>>
编辑:你的问题是:

int reservations[17][11];

这有17/11维度,你正在重复18/12。 使用int[18][12]

答案 3 :(得分:1)

您的reservations数组太小了。您应该使用行数/列数(即18和12)初始化它,而不是最高索引。初始化保留时,它将在数组末尾运行并损坏movieName,之后当您尝试访问它时会发生任何事情。

此外,您可能已经知道这一点,但您不需要始终在C ++中使用this->为成员变量访问加前缀。除非你有一个同名的局部变量(如你的setMovieName函数),否则这是隐含的。

答案 4 :(得分:1)

您声明了一个数组int reservations[17][11];,但您的构造函数正在访问[0 to 17][0 to 11],这超出了有效范围[0 to 16][0 to 10]

您应该比该数组更喜欢std::vector<std::vector<int>>