0

我需要一个动态的二维整数数组,它将代表一个标准矩阵。大小和元素在运行时从文件中读取。

从其他堆栈帖子中获取指导​​,我将数组设置如下;

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);
            }
     }
 }

我应该补充一点,我知道我可以使用向量。我在这里挑战自己,负责任地使用指针构建、使用和取消分配二维数组。

4

3 回答 3

1

如果要在函数内分配初始数组,则需要将其作为三重指针传递并更改为:

*2dArray = new int*[size],

或返回一个整数**

否则,您将丢失指向新内存的指针。

不要忘记,指针是按值传递的。照原样,在您buildArray()调用之后,您仍然没有指向有效内存的指针。

于 2013-02-27T18:00:10.297 回答
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);
}
于 2013-02-27T17:56:42.120 回答
0

当您在函数中分配一个传入参数的指针时,您只会更改复制值。在 C/C++ 中,当您向函数发送参数时,会创建此参数的副本。因此,就像之前提到的其他答案一样,可以返回指针的新值,将指针更改void buildArray(...)int** buildArray(...)或发送指针上的指针(看起来很困难),或者最后,您在 C++ 中,因此您可以发送参考,void buildArray(ifstream &file, int**& 2dArray)2dArray 也将是来自 main 的真正指针,您应该在不更改代码的情况下更改他的值。

于 2013-02-27T22:36:05.427 回答