2016-09-18 70 views
0

我正试图在课堂上做一些淘气的事情,并得到了我无法解决的崩溃。我相信这是因为尝试读取未分配的数据而引起的,尽管我认为应该分配和填充数据。帮帮我..?功能范围崩溃中的指针

void read(int &n, int &m, double ** arr){ 
    fstream f1; 
    f1.open("1.txt"); //open a file to read the data from it 
    f1>>n>>m; 

    arr = new double *[n];//create an array of pointers (double) 

    for(int e = 0; e<n; e++){ 
     arr[e] = new double[m]; //assign arrays of doubles to each pointer in the array 
     for(int l = 0; l < m; l++){ 
      arr[e][l]= 0.f; //set it to 0 
     } 
    } 
    for(int e = 0; e<n; e++){ 
     for(int s = 0; s<m; s++){ 
      f1>>arr[e][s]; //read it from file 
     } 
    } 
    f1.close(); 
    cout<<arr[3][4]<<"\n"; //prints out fine (the last number in my test matrix) 
} 

int main(){ 
    double ** matrix; 
    read(n, m, matrix); //fills the matrix 
    cout<<matrix[0][0]; //crashes the program 

    return 0; 
} 

回答

0

您发送matrix作为参数,它是由价值复制到arr。然后在read()内存分配和处理完成。当read()结束时,它只是销毁arr指针,即不是matrix,现在我们又回到了main()matrix仍然未分配(调试模式下的nullptr)。请将arrread()更改为main(),并将其保存在matrix中。在这种情况下,返回类型read()应该是double**。那么请不要忘记delete matrix main()

编辑:

指针具有在RAM物理内存。 matrix有它自己的物理内存,称之为0xAAAA,并且arr在RAM中有自己的内存,称之为0xBBBB。当matrix传递给read(),新的双指针在RAM中这是不一样的matrix,这个新的指针由arr你的情况称为创建。要确认它,请使用cout << &matrix;cout << &arr;,您会看到它们位于两个不同的位置。现在,当read()被调用时,的matrix内容在创建后复制到arr。在拨打read()时,matrix为空,即指向0x0000位置,内容复制意味着现在arr指向同一位置,即0x0000或null。使用cout << matrix;cout << arr进行确认,结果相同。现在您为arr分配新的内存。 matrix不知道这个内存,它仍然指向0x0000。当read()结束时,arr被销毁,但不是内容arr。使用new关键字分配的内存现在由无指针指向。当控制回到main()read()结束后,matrix仍然指向0x0000。你想访问它并得到错误。现在,您必须有一种方法,您可以将matrix指向由arr分配的内存,否则将是内存泄漏。有多种方式,其中1个是返回arr, other is to allocate memory in main()的内容。(), process using read()and again access memory after read()`结束。

+0

在矩阵中,'matrix'不是'物理地址'吗?我可以做到这一点,所以我不需要返回任何东西?对不起,如果这是原始的东西,但我想知道什么是在这里引擎盖 – user2468893

+0

让我编辑我的答案,并添加一些关于“引擎盖下”的事情 – Awais

+0

我没有添加细节**内存泄漏* *并正确删除'矩阵'。好的做法是总是删除'new'分配的内存以避免内存泄漏。 – Awais

0

readarr分配内存,但尝试main使用它。如果您想将arr用作输出参数(如nm),则应将其作为参考。

+0

你能详细点吗?我认为指针在这里很像引用。我假设我用'matrix'作为参数得到实际地址,然后在那里用数据填充空间。我该如何在这里使用参考? – user2468893