0

我用c的可變長度數組實現一種算法:如何在堆上創建可變長度的數組?

int matrix[rows][cols]; 

我設法測試,這並失敗的荒謬的尺寸。有沒有辦法在堆上分配這個矩陣而不是堆棧?否則,我將不得不重寫這個到int** ...

有點像calloc(sizeof(int[rows][cols]), 1)?請注意,這個問題是關於變長數組的,特別是

+0

@ user3528438我問** **關於變長數組數據類型。另外,5D,認真嗎? –

+4

適用於5D的東西可以簡化爲適用於2D。你有沒有嘗試'calloc(sizeof(int [rows] [cols]),1)'?你得到了多少尺寸?實際上,更重要的是打印'rows','cols'和'sizeof'表達式的值。它會給你你需要的東西嗎?問題是「我將結果分配給什麼」? –

+0

@TomášZato5D?是的,認真!爲什麼不? –

回答

2

看起來很簡單。唯一遠程棘手位是指針保持到動態分配的數組的類型:

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

static void print_matrix(int r, int c, int matrix[r][c]) 
{ 
    for (int i = 0; i < r; i++) 
    { 
     for (int j = 0; j < c; j++) 
      printf(" %d", matrix[i][j]); 
     putchar('\n'); 
    } 
} 

static void set_matrix(int r, int c, int matrix[r][c]) 
{ 
    for (int i = 0; i < r; i++) 
    { 
     for (int j = 0; j < c; j++) 
      matrix[i][j] = (i+1) * 100 + j + 1; 
    } 
} 

int main(void) 
{ 
    size_t rows = 9; 
    size_t cols = 7; 
    size_t size = sizeof(int[rows][cols]); 
    printf("rows = %zu, cols = %zu, size = %zu\n", rows, cols, size); 
    int (*matrix)[cols] = calloc(sizeof(int[rows][cols]), 1); 
    if (matrix != 0) 
    { 
     set_matrix(rows, cols, matrix); 
     print_matrix(rows, cols, matrix); 
     free(matrix); 
    } 
    return 0; 
} 

此代碼小心使用calloc()爲零數組的所有元素,然後調用set_matrix()將它們設置爲非零值。正如所寫,malloc()會比calloc()更好,但使用的問題calloc()並且它也不難用於此代碼(例如,set_matrix()中的條件賦值,如if (i && j && i != j))。

輸出示例:

rows = 9, cols = 7, size = 252 
101 102 103 104 105 106 107 
201 202 203 204 205 206 207 
301 302 303 304 305 306 307 
401 402 403 404 405 406 407 
501 502 503 504 505 506 507 
601 602 603 604 605 606 607 
701 702 703 704 705 706 707 
801 802 803 804 805 806 807 
901 902 903 904 905 906 907 
1

您可以創建一個指向VLA:

size_t rows, cols; 
... // get values for rows and cols 
T (*arr)[cols] = malloc(sizeof (T [cols]) * rows); 
if (arr) 
{ 
    ... 
    arr[i][j] = some_value; 
    ... 
} 

有過是否

T (*arr)[cols] = malloc(sizeof *arr * rows); 

應該工作的一些爭論。由於sizeof必須在運行時評估*arr(因爲表達式*arr引用了VLA),因此在評估sizeof *arr時是無效指針,因此此表單的結果爲未定義行爲。

但是,它取決於「評估」在該特定上下文中的含義;沒有理由要取消引用arr,以確定它指向數組的大小,任何超過你會爲一個固定長度的數組:

T (*arr)[10] = malloc(sizeof *arr * rows); 

我和其他幾個人是的認爲該標準在這方面措辭不佳,並且sizeof *arr應該是有效的,無論arr指向固定的還是可變長度數組。這是我使用的成語,它並沒有失敗... 還有

但是,如果我沒有指出這個問題,並且爲您提供一些我知道將不會導致UB的情況,我將會失職。

相關問題