簡體   English   中英

將2D數組傳遞給C中的函數

[英]Passing a 2D array to a function in C

從本質上講,我有一個數據矩陣(可以說是整數),我想將其存儲在二維數組中,直到運行時才知道維度(例如x列和y行)。 我想將數組填充到函數中,所以我假設我需要執行以下操作:

int main(int argc, char **argv) {
    int y = atoi(argv[1]);
    int x = atoi(argv[2]);
    int **matrix = malloc(x * sizeof(int*));
    populateMatrix(matrix, y, x);
    return 0;
}

void populateMatrix(**matrix, int y, int x) {
    int i, j;
    for (i = 0; i < y; i++) {
        for (j = 0; j < x; j++) {
            matrix[i][j] = i * j; // populated with trivial data to keep it simple
        }
    }
}

顯然,這是行不通的,但是我不確定該如何正確地進行描述。

您缺少的是每個內部數組也需要進行malloc。

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

應該是這樣的:

int **matrix = (int **)malloc(y * sizeof(int *));
for (i = 0; i < y; ++i) {
    matrix[i] = (int *)malloc(x * sizeof(int));
}

也就是說,我知道的大多數矩陣庫都只會使用:

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

然后使用:

int n = matrix[y * cols + x];

閱讀各個元素。 對於(非稀疏)矩陣,這比為每一行單獨分配一個塊更有效。 它還保證了數據在內存中是連續的,這可以使CPU緩存更有效。

您不僅可以使用一維數組並按行或按列存儲嗎? 然后,您只需使用array[row * numcols + col]而不是array[row][col]來訪問數組元素。

它實際上在內部沒有任何區別,因為內存並不關心您使用二維還是一維。

main中的matrix是指向int的指針。 您的程序為x指向int的指針分配空間。 考慮到populateMatrix中的循環,該空間應該是y指向int的指針的空間。 更重要的是,您尚未為行分配空間。 您需要在main中的另一個循環,該循環將分配y行,每個行足以容納x個int。

C99有一個簡單的工具,通常不贊成使用,但可以精確地滿足您的需要,可變長度數組VLA。

void populateMatrix(size_t y, size_t x, double matrix[x][y]);

之所以皺眉,是因為如果直接使用它們在堆棧上分配矩陣,則可能會觀察到堆棧溢出。 您可以通過實際傳遞指向此類野獸的指針來避免這種情況:

void populateMatrix2(size_t y, size_t x, double (*matrix)[x][y]) {
  for (... something ...) {
     (*matrix)[i][j] = 33.0;
  }
}

在某些功能上:

double (*myMatrix)[n][m] = malloc(sizeof(*myMatrix));
populateMatrix2(n, m, myMatrix);

對於語法,您只需要使尺寸的大小在參數列表中的矩陣之前即可,以便此時知道它們。 對於對象的索引和大小,也請使用size_t ,通常沒有意義的是簽名類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM