2016-09-18 105 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