我需要一个动态的二维整数数组,它代表一个标准矩阵。在运行时从文件中读取大小和元素。
从其他堆栈帖子中获取指示我已按如下方式设置我的数组;
void buildArray(ifstream &file, int** 2dArray);
void buildQueue(Queue<int> &Q, int** 2dArray);
int main()
{
int** 2dArray;
Queue<int> Q;
//...
// open file
//...
buildMatrix(file, 2dArray)
buildQueue(Q, 2dArray)
}
void buildArray(ifstream &file, int** 2dArray)
{
int size, element;
while (file.good()) {
file >> size;
2dArray = new int*[size];
for (int i = 0; i < size; i++)
2dArray[i] = new int[size];
// now I should be able to use 2dArray[r][c]
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
file >> element;
2dArray[i][j] = element;
}
}
}
然后我需要读取存储在每个位置[r] [c]的整数并构建一个队列。我认为我的问题是取消引用指针...但我不确定。
void buildQueue(Queue<int> &Q, int** 2dArray)
{
int row, column, element;
// size is passed in as well, size is our rows or columns size here
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
row = i;
column = j;
element = 2dArray[i][j]; // getting seg fault here!
Q.push_back(row, column, element);
}
}
}
我应该补充一点,我知道我可以使用矢量。我在这里挑战自己负责任地使用指针构建,使用和释放二维数组。
答案 0 :(得分:1)
什么是桌子?
table = new int*[size];
不应该是
2dArray = new int*[size];
还从函数
返回指针更改
void buildArray(ifstream &file, int** 2dArray)
到
int ** buildArray(ifstream &file)
因为否则buildArray会获取变量的副本。此副本现在保存指向已分配内存的指针。调用函数中的指针永远不会更新。
在原始代码中,在buildArray调用之前和之后添加printf 2dArray。
printf("%p, 2dArray);
buildMatrix(file, 2dArray);
printf("%p, 2dArray);
你会看到2dArray没有改变。所以你基本上没有初始化 指向buildQueue的指针。
buildArray和call应该像这样改变
void buildArray(ifstream &file, int** arr)
{
int size, element;
while (file.good()) {
file >> size;
arr = new int*[size];
for (int i = 0; i < size; i++)
arr[i] = new int[size];
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
file >> element;
arr[i][j] = element;
}
}
}
return arr;
}
int main()
{
int** 2dArray;
Queue<int> Q;
//...
// open file
//...
2dArray = buildMatrix(file);
buildQueue(Q, 2dArray);
}
答案 1 :(得分:1)
如果要在函数内部分配初始数组,则需要将其作为三重指针传递并更改为:
*2dArray = new int*[size]
,
或返回一个int **
否则你将丢失指向新内存的指针。
不要忘记,指针是按值传递的。就像在buildArray()
调用之后,你仍然没有指向有效内存的指针。
答案 2 :(得分:0)
在函数中分配参数中传递的指针时,只更改复制值。在C / C ++中,当您向函数发送参数时,会创建此副本。所以,就像之前的其他答案一样,可以返回指针的新值,将void buildArray(...)
更改为int** buildArray(...)
或者在指针上发送指针(看起来很难),或者最后,你'在C ++中,你可以发送一个引用,void buildArray(ifstream &file, int**& 2dArray)
2dArray也是来自main的真正指针,你应该在不改变代码的情况下改变它的值。