2010-11-21 112 views
1

我有幾行C++代碼,它有簡單的目的 - 將矩陣存儲在二維數組中,並且不會消耗比需要更多的內存。這意味着我必須爲矩陣中的每個數字分配內存,然後再將其放入矩陣中。二維數組(矩陣)內存分配問題

3838分割故障(核心轉儲)SH 「$ {SHFILE}」

的STACKDUMP:

#include <cstdlib> 
#include <cstdio> 

using namespace std; 

int main() { 
    int ** matrix; 

    matrix = (int**)malloc(sizeof(int*)); 

    // Fill in the matrix 
    matrix[0] = (int *) malloc(3 * sizeof(int)); 
    matrix[0][0] = 5; 
    matrix[0][1] = 10; 
    matrix[0][2] = 15; 

    matrix[1] = (int *) malloc(3 * sizeof(int)); 
    matrix[1][0] = 2; 
    matrix[1][1] = 4; 
    matrix[1][2] = 6; 

    int i, n; 

    // Print the whole matrix 
    for (n = 0; n < 3; n++) { 
     for (i = 0; i < 3; i++) { 
      printf("%i\t", matrix[n][i]); 
     } 
     printf("\n"); 
    } 

    return 0; 
} 

當我編譯代碼以上並運行它,它打印矩陣時崩潰看起來像這樣:

Exception: STATUS_ACCESS_VIOLATION at eip=0040126A 
eax=00000000 ebx=00B0021C ecx=00000000 edx=00000000 esi=6123DBAA edi=61179FC3 
ebp=0028CD18 esp=0028CCF0 program=C:\workspace\c\PA1_9\dist\Debug\Cygwin_4.x-Windows\pa1_9.exe, pid 3828, thread main 
cs=0023 ds=002B es=002B fs=0053 gs=002B ss=002B 
Stack trace: 
Frame  Function Args 
0028CD18 0040126A (6123DBAA, 61179FC3, 0028CD58, 61006CD3) 
0028CD58 61006CD3 (00000000, 0028CD94, 61006570, 7EFDE000) 
End of stack trace 

我想會有一些指針/值的麻煩......但我不知道在哪裏和爲什麼......

+0

在附註中,程序中存在內存泄漏。 – bjskishore123 2010-11-21 12:39:05

+0

這是* NOT * C++。 – rubenvb 2010-11-21 12:44:53

+0

當然是!這只是糟糕的C++。 :P – 2010-11-21 13:26:40

回答

3

你的代碼幾乎是正確的,但矩陣分配是錯誤的。您分配的空間來存儲一個int *當你嘗試初始化兩個元素(matrix[0]matrix[1]):

matrix = (int**)malloc(2 * sizeof(int *)); 

外印刷循環是錯誤的:有矩陣中只有2「線」(與3列每)。

// Print the whole matrix 
for (n = 0; n < 2; n++) { 
    for (i = 0; i < 3; i++) { 
     printf("%i\t", matrix[n][i]); 
    } 
    printf("\n"); 
} 
+0

哦,我錯過了...... :-))非常感謝你...... – 2010-11-21 10:50:26

+0

2icecream:我想接受答案,但是我可以在發佈我的問題後的7分鐘內做到這一點。請等待幾分鐘:)) – 2010-11-21 10:55:18

4

如果知道矩陣是3×3,爲什麼所有的malloc S:當您嘗試訪問matrix[2]程序將會崩潰?爲什麼不簡單地說:

int matrix[3][3]; 

這也負責自動釋放內存。 (您忘記了在您的代碼中撥打free!)

+0

他沒有「忘記」打電話給free()。程序在'return 0;'處找到...不需要免費通話。 – 2015-10-21 15:10:35