2013-03-13 64 views
2

一個Mallocate陣列功能我有,我在C.創建用C

我試圖通過創建mallocateArray功能,以減少冗餘代碼創建整數幾個動態2維數組的項目。我可以讓它在沒有這個功能的情況下工作。

問題是指針可以讓人討厭,由於某種原因,我只是得到一個賽格故障時,我嘗試使用這種方法:

繼承人我得到了什麼:

 void mallocateArray(int ***array, int *row, int *col){ 
    //allocate storage for the array of ints: 
     *array = (int**)malloc(*row * sizeof(int *)); 
     int i; 
     for (i = 0; i < *row; i++){ 
      *array[i] = (int*)malloc(*col * sizeof(int)); 
     } 
    } 

這裏是如何我陣列被定義爲:

 int **matrix1, 
    int row = 2 
    int col = 3 

    mallocateArray(&matrix1, &row, &col); 

當我運行它時,我得到一個seg故障。 所以目前我只是不使用該方法並處理冗餘。 我已經嘗試搞亂指針,通過解引用等,但我似乎無法弄清楚。

我希望你們能幫我一把。

 result = (int**)malloc(row1 * sizeof(int *)); 
int i; 
for (i = 0; i < row1; i++){ 
    result[i] = (int*)malloc(col2 * sizeof(int)); 
} 
+0

你應該首先簡化你的代碼,通過傳遞'row'和'col'的值,而不是通過指針。 – 2013-03-13 01:17:02

+0

您不需要在C程序中投射'malloc'的返回值。 – 2013-03-13 01:17:18

+0

您在此處分配的對象不是二維數組。是的,您可以使用'[] []'語法來訪問它,但它與用'int [] []'聲明的數組不同。它通常被稱爲「鋸齒狀陣列」或「不規則陣列」。 – dmckee 2013-03-13 01:23:31

回答

6

你接近:

下面有一個在我的主要方法的代碼,例如工作。只是缺少一些括號。這條線:

*array[i] = (int*)malloc(*col * sizeof(int)); 

應該是:

(*array)[i] = malloc(*col * sizeof(int)); 

當心操作的那些訂單!我也拿出了你不必要的演員。

如果您按值通過了rowcol,那麼您的函數將不那麼複雜。示例:

void mallocateArray(int ***array, int row, int col) 
{ 
    *array = malloc(row * sizeof(int *)); 
    for (int i = 0; i < row; i++){ 
     (*array)[i] = malloc(col * sizeof(int)); 
    } 
} 
+2

如果他返回一個「int **」而不是接受一個「int ***」,他的函數會變得非常複雜。 – 2013-03-13 01:29:22

+0

我會爲此喝下去的。 – 2013-03-13 01:30:18

+0

非常感謝你!是的,我沒有注意到我有一些冗餘的指針行和col ...肯定編碼方式太多C今天,但我肯定得到了很多更好的指針,所以謝謝一堆 – 2013-03-13 01:57:32

4

您正在分配數組數組。這裏有一個有趣的pro-tip - 你可以將已知維度的二維數組壓縮成一維數組!要從(x,y)索引轉換爲單維索引,請使用以下代碼: i =(x + y * cols)

這樣做可以讓您爲陣列生成單個連續的內存塊,而不是本質上的內存塊列表。嘗試使用malloc(sizeof(int)* row * column)並公開數組訪問,如上所述。

這將減少對列的取消引用並提供(小但現在)性能增加的需要。

+0

爲什麼不分配它作爲二維數組(仍然是連續的內存板),並能夠使用[] []'來訪問它仍然? – 2013-03-13 01:22:34

+0

你不想'我=(x + y * cols)'?假設'y'是行索引,'x'是列索引,也就是說。 – 2013-03-13 01:24:00

+0

@CarlNorum我不認爲我遵循,你怎麼能確保整個二維數組是一個「連續」的內存塊? – 2013-03-13 01:27:23