将值传递给动态分配的数组时出现分段错误

时间:2018-01-17 17:16:50

标签: c++ arrays pointers

我正在完成一项任务,要求我模拟兰顿的蚂蚁。我已经在类Ant的构造函数中为2D数组动态分配了内存。指向此数组的指针是Ant类的成员。另外,我已经为我用来将这些值传递给我的数组的行和列定义了get函数。

Ant.hpp

#ifndef ANT_HPP
#define ANT_HPP

enum Direction {UP, RIGHT, DOWN, LEFT};

class Ant
{
private:
char** board;
char spaceColor;
Direction facing;
int rows, cols, steps, stepNumber;
int startRow, startCol, tempCol, tempRow;
int lastRow, lastCol;
int thisRow, thisCol;

public:
Ant();
Ant(int, int, int, int, int);
void print();
void makeMove();
};

Ant.cpp

Ant::Ant()
{
rows = 5;
cols = 5;
steps = 5;
startRow = 0;
startCol = 0;
stepNumber = 0;
facing = LEFT;
setThisRow(5);
setThisCol(5);
setLastRow(5);
setLastCol(5);
setSpaceColor(' ');
board = new char*[rows];
for(int i = 0; i < rows; ++i){
board[i] = new char[cols];
}
for(int i = 0; i < rows; ++i){
for(int i = 0; i < rows; ++i){
board[i][j] = ' ';
}
}
board[startRow][startCol] = '*';
}

char Ant::getSpaceColor()
{
return spaceColor;
}

void Ant::makeMove()
{
if(getSpaceColor() == ' '){
board[getLastRow()][getLastCol()] = '#';
}
}

int Ant::getLastRow()
{
return lastRow;
}

int Ant::getLastCol()
{
return lastCol;
}

的main.cpp

#include "Ant.hpp"
#include <iostream>

using std::cout;
using std::endl;

int main()
{
Ant myAnt;
myAnt.print();
myAnt.makeMove();
return 0;
}

Gdb在这行代码中报告了一个分段错误:

board[getLastRow()][getLastCol()] = '#';

Gdb能够为getLastRow()&amp ;;打印准确的值。 getLastCol(),但无法访问board [getLastRow()] [getLastCol()]的内存。

我不确定我做错了什么,非常感谢任何帮助

3 个答案:

答案 0 :(得分:2)

假设board [getLastRow()] [getLastCol()]转换为board [5] [5],则超出缓冲区。你的董事会是0..4。

答案 1 :(得分:1)

您通过访问超出范围的数组元素来调用undefined behavior。你的setLastRow(5);setLastCol(5);函数会导致getLastRow()getLastCol()函数都返回5的值,但由于数组零索引,这意味着您访问6th元素。所以:

board[getLastRow()][getLastCol()] = '#';
你正在有效地致电:

board[5][5] = '#'; // undefined behavior because there are no 6 X 6 elements

而您的最大索引只能为4

board[4][4] = '#'; // OK as there are 5 X 5 elements

一种解决方案是让您的函数分别返回lastRow - 1lastCol - 1

答案 2 :(得分:0)

分段错误通常是指程序正在访问未分配的地址。

板[getLastRow()] [getLastCol()]

您可能想要检查数组的起始索引和结束索引。

  • 我想你可能会分配索引从0
  • 开始的2D数组
  • getLastRow()/ Col可能会返回行/ Col
  • 的大小
  • 因此,当索引从0开始时,您的最后一行索引将是getLastRow() - 1,同样的事情将适用于列

产生==&gt;板[getLastRow() - 1] [getLastCol() - 1]