2013-06-27 130 views
0

我是C編程的新手(長時間重新學習它)。我正在嘗試使用malloc動態分配內存到二維數組。我試圖按照如下的計算器上的答案如thisthis。但我仍然遇到分段錯誤。動態分配C數組中的二維數組時出現分段錯誤

我的代碼是如下

#include <stddef.h> 
#include <stdio.h> 
#include <stdlib.h> 

void allocate2DArray(int **subset, int a, int b) 
{ 
    subset = (int **)malloc(a * sizeof(int *)); 
    int i,j; 

    for(i = 0 ; i < a ; i++) 
    subset[i] = (int *) malloc(b * sizeof(int)); 

    for(i = 0 ; i < a ; i++) 
    for(j = 0 ; j < b ; j++) 
     subset[i][j] = 0; 
} 

int main() 
{ 
    int **subset; 
    int a = 4, b = 4; 
    allocate2DArray(subset, a, b); 
    int i,j; 
    for(i = 0 ; i < a ; i++) 
    { 
    for(j = 0 ; j < b ; j++) 
    { 
     printf("%d ", subset[i][j]); 
    } 
    printf("\n"); 
    } 
} 

當我評論行打印的陣列,它好好嘗試給出任何錯誤和程序的執行沒有段故障。請幫助我瞭解我哪裏出錯了。

+0

C中的函數參數通過值*傳遞*。所以你在'main'中的函數調用什麼都不做(除了內存泄漏)。 –

回答

2

All problems in computer science can be solved by another level of indirection

void allocate2DArray(int ***p, int a, int b) 
{ 
    int **subset; 
    *p = (int **) malloc(a * sizeof(int *)); 
    subset = *p; 

// ... 
allocate2DArray(&subset, a, b); 
+1

謝謝@ctn ..工作。我也試過了,沒有使用int **子集。像這樣..'* p =(int **)malloc(a * sizeof(int *));對於(i = 0; i quirkystack

+0

@quirkystack對我來說'void allocate2DArray(int *** p,int a,int b){int i,j; * p =(int **)malloc(a * sizeof(int *)); for(i = 0; i ctn

+0

我的錯誤..在我的實際程序中沒有在* p附近添加paranthesis。謝謝 – quirkystack

0

您必須將int ***subset傳遞給分配函數。這是因爲參數是按值傳遞的。

0

你需要這樣的:

void allocate2DArray(int ***subset, int a, int b) 

這:

allocate2DArray(&subset, a, b); 
0

通過使用int **subset;它不會成爲二維數組。它仍然是一維存儲和指針指針。

二維數組意味着指針緩衝區的每個元素都必須指向由ctn建議的緩衝區。 他建議*** ptr和* ptr是malloced,它創建了緩衝區的第一維。 現在當你調用allocate2DArray()時,子集被分配了內存,它創建了第二個維度。其中驗證我的上面的語句 - 指針緩衝區的每個元素必須指向一個緩衝區。

所以現在所建議的代碼 -

*p = (int **) malloc(a * sizeof(int *)); 

創建的陣列,其點的每個元素到緩衝「子集」,其總共創建真實的2D陣列。