函数范围崩溃中的指针

时间:2016-09-18 18:05:12

标签: c++ pointers matrix double

我试图在课堂上做一些顽皮的事情并且遇到了我无法解决的崩溃。我认为这是因为尝试读取未分配的数据,即使我认为应该分配和填充数据。帮助..?

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

2 个答案:

答案 0 :(得分:0)

您在arr中为read分配内存,但尝试在main中使用它。如果您想将arr用作out参数(例如nm),则应将其作为参考。

答案 1 :(得分:0)

您正在发送matrix作为参数,它正按值复制到arr。然后在read()内存中分配并完成处理。当read()结束时,它只会破坏arr指针,即完全不是matrix的指针,现在我们回到main()并且matrix仍未分配(调试模式下的nullptr)。将arrread()返回main()并将其存储在matrix中。在这种情况下,read()的返回类型应为double**。不要忘记在delete中正确使用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会被销毁,但<{1}}的内容会被销毁。使用arr关键字分配的内存现在由无指针指向。当new结束后控件返回main()时,read()仍然指向0x0000。您想要访问它并获得错误。现在必须有一种方法可以将matrix指向由matrix分配的内存,否则它将是内存泄漏。有很多种方法,其中一种方法是返回arr main()arr, other is to allocate memory in read(), process using read()`ends的内容。