我一直在寻找堆栈溢出和cplusplus论坛,没有运气。我是c ++的新手,我目前正在为一个学校项目开发游戏。我没有问题创建,填充,销毁一个二维指针数组,并在我的游戏中使用一个,它工作得很好。
我为玩家创建了一个新类,并将2d数组移动到该类中。现在,当我尝试运行程序时,我遇到了分段错误。任何人都可以告诉我为什么会这样吗? 粗体我不能简单地使用std :: vector<>因为指针的2d数组是必需的。
class Player
{
public:
Player();
...
short** allocate_2d_array();
....
protected:
short **board;
static const short BOARD_DIMENSIONS;
...
};
功能
short** Player::allocate_2d_array()
{
short **array2d;
// Insert columns
for(int i = 0; i < this->BOARD_DIMENSIONS; i++)
{
array2d[i] = new short[this->BOARD_DIMENSIONS];
// Fill in the numbers
for(int j = 0; j < this->BOARD_DIMENSIONS; j++)
{
array2d[i][j] = 0;
}
}
return array2d;
}
它被称为
Player::Player()
{
this->turns_taken = 0;
// Prepare the board
this->board = this->allocate_2d_array();
...
}
提前感谢您的帮助。
答案 0 :(得分:3)
for循环体的第一行在为其分配任何内存或初始化之前取消引用指针array2d
(使用方括号运算符)。
要避免此问题,您必须在输入for循环之前分配数组的第一个维度。一旦分配了这个指针数组,就可以分配BOARD_DIMENSIONS
个short
数组,并将指针存储在第一个数组的元素中。
类似的东西:
short** array2d = new short*[BOARD_DIMENSIONS];
for (size_t u = 0; u < BOARD_DIMENSIONS; ++u)
{
array2d[u] = new short[BOARD_DIMENSIONS];
// You could then use memset to initialize the array, or
// use a for loop, like in your example:
for (size_t v = 0; v < BOARD_DIMENSIONS; ++v)
{
array2d[u][v] = 0;
}
}
使用operator delete []