2010-08-05 114 views
5

我有一個2維數組動態分配在我的C代碼,在我的功能主。我需要將這個2D數組傳遞給一個函數。由於數組的列和行是運行時間變量,我知道一種通過它的方法是:如何將2D動態分配數組傳遞給函數?

- 通過行和列變量以及指向數組中的[0] [0]元素的指針

myfunc(&arr[0][0],rows,cols) 

然後在調用的函數,訪問它作爲一個「變平」一維數組,如:

ptr[i*cols+j] 

但我並不想這樣做的,因爲這將意味着很多更改代碼,因爲早些時候,傳遞給此函數的2D數組是靜態分配的,其維數已知在編譯時。

那麼,如何將二維數組傳遞給一個函數,並仍然可以將它用作一個二維數組,並具有如下所示的兩個索引?

arr[i][j]. 

任何幫助將不勝感激。

回答

7
#include <stdio.h> 
#include <stdlib.h> 
void doit(int ** s , int row , int col) 
{ 
    for(int i =0 ; i <col;i++){ 
      for(int j =0 ; j <col;j++) 
       printf("%d ",s[i][j]); 
      printf("\n"); 
    } 
} 
int main() 
{ 
    int row =10 , col=10; 
    int ** c = (int**)malloc(sizeof(int*)*row); 
    for(int i =0 ; i <col;i++) 
     *(c+i) = (int*)malloc(sizeof(int)*row); 
    for(int i =0 ; i <col;i++) 
      for(int j =0 ; j <col;j++) 
       c[i][j]=i*j; 
    doit(c,row,col); 
} 

希望這是你想要的方式....

+0

這就是它 - 儘管代碼在內存中有輕微的錯誤。分配部分..但得到了主意。 – goldenmean 2010-09-21 08:38:37

1

如果不改變很多代碼,你真的無法做到這一點。我建議將它包含在包含限制的結構中,然後使用正則表達式search'n'replace來修復訪問。

也許使用像AA(arr,i,j)這樣的宏(如在Array Access中),其中arr是結構。

+0

所以基本上u的說法 - 把它做沒有程序化的方式,但「查找和替換」。這是對的嗎? – goldenmean 2010-08-05 13:12:24

+0

是的,這是它的要點。 – 2010-08-05 14:36:09

1

據我所知,所有你可以傳遞給函數的是指向數組的第一個元素的指針。當你將一個實際的數組傳遞給一個函數時,就會說「數組衰減成一個指針」,所以沒有關於指向數組的大小的信息。

對出現在表達式中的T型數組對象的引用會衰減(有三個例外)爲指向其第一個元素的指針;結果指針的類型是指向T的指針。

我相信你可以在C FAQ找到更多關於這方面的信息。

0

Numerical recipes in C(一本主要處理矩陣的書)提出了一種乾淨利落的方法,仍然處理2D矩陣。查看1.2節「矩陣和2D陣列」和方法convert_matrix()

本質上你需要的是分配一組指針指向你的行向量。並將其傳遞給函數以及行數和列數。

2

如果你的編譯器支持C99變長數組,那麼你可以聲明函數像這樣(如GCC):

int foo(int cols, int rows, int a[][cols]) 
{ 
    /* ... */ 
} 

你也可以使用一個指針調用代碼一VLA類型:

int (*a)[cols] = calloc(rows, sizeof *a); 
/* ... */ 
foo(cols, rows, a); 
0

C中的二維數組只是一個數組數組。這裏亞去:

void with_matrix(int **matrix, int rows, int cols) { 
    int some_value = matrix[2][4]; 
} 

int main(int argc, char **argv) { 
    int **matrix; 
    ... create matrix ... 
    with_matrix(matrix, rows, cols); 
} 
0
int cols = 4; 
    int rows = 3; 
    char** charArray = new char*[rows]; 
    for (int i = 0; i < rows; ++i) { 
     charArray[i] = new char[cols]; 
    } 

    // Fill the array 
    for (int i = 0; i < rows; ++i) { 
     for (int j = 0; j < cols; ++j) { 
      charArray[i][j] = 'a'; 
     } 
    } 

    // Output the array 
    for (int i = 0; i < rows; ++i) { 
     for (int j = 0; j < cols; ++j) { 
      cout << charArray[i][j]; 
     } 
     cout << endl; 
    } 
+0

請添加更多關於您正在嘗試執行的操作的信息 – 2016-12-09 16:39:26