2013-02-27 55 views
0

我需要一个动态的二维数组,它将表示一个标准矩阵。大小和元素在运行时从文件读入。C++在二维数组指针访问值

从其他堆栈的帖子中获取方向我已经设置了我的数组,如下所示;

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

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

+1

在单个内存块int * table = new int [size * size];中使用'table [column + size * row]'(或make围绕这个简单的包装类)? – hyde 2013-02-27 18:07:21

+0

可能是。我在这个项目的早些时候正在考虑这个方法。这里的陷阱就是第二个数组。 – frankV 2013-02-27 18:25:20

+0

您的评论似乎被切断了,但您仍然可以使用行指针轻松生成额外的数组:'int * rows []'并且避免每行有堆块的开销。或者只是'int * rowarray = table + row * size'。 – hyde 2013-02-27 18:42:53

回答

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和呼叫应该改变这样的

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

我第一次发布这个问题时没有注意到。它已被编辑。 – frankV 2013-02-27 17:58:50

+0

所以你不会将2dArray传递给函数?有些事情令我困惑。你将如何访问它? (对不起,如果这听起来像一个愚蠢的问题) – frankV 2013-02-27 18:26:46

+0

或者是使2dArray全球的解决方案? – frankV 2013-02-27 18:47:22

1

如果您分配一个函数内的初始阵列,您可能需要把它作为一个三重指针,更改为:

*2dArray = new int*[size]

或返回int **

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

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

0

当您在函数中分配一个指向参数的指针时,您只会更改复制值。在C/C++中,当您向参数发送参数时,会创建一个副本。因此,与其他答案一样,可以将指针的新值更改为void buildArray(...)或​​或在指针上发送指针(这看起来很困难),或者最终,您使用C++,因此您可以发送参考,void buildArray(ifstream &file, int**& 2dArray)也2dArray将是从主的真正的指针,你应该改变他的价值,而不改变你的代码。