簡體   English   中英

動態重新分配-2D陣列

[英]Dynamic reallocation - 2D array

void matrixSetSize(double ***pMatrix, int size) {

    if (*pMatrix == NULL) { // void matrix
        *pMatrix = (double**)malloc(size * sizeof(double*));
        for (int i = 0; i < size; i++)
            *(*pMatrix + i) = (double*)malloc(size * sizeof(double));
    }
    else { // resize existing matrix
        double **pointer = (double**)realloc(*pMatrix, 2 * size * sizeof(double*));
        for(int i = 0; i < size; i++)
            pointer[i] = (double*)realloc(*(pMatrix+i), 2 * size * sizeof(double));

        for (int i = size; i < 2 * size; i++)
            pointer[i] = (double*)malloc(size * sizeof(double));

        for(int i = 0; i < size; i++)
            free(*(*pMatrix + i));
        free(*pMatrix);

        *pMatrix = pointer;
    }

}

問題:當我嘗試重新分配矩陣的大小時,代碼將不起作用,我也不知道為什么。 有人可以向我解釋為什么不起作用嗎?

那不能解決您發布的代碼的問題,但是也許可以幫助您獲得更大的前景:

double (*matrix)[size] = malloc(initial_size * initial_size * sizeof(double));
matrix[0][0] = 42;
matrix[size-1][size-1] = 24;

/* resizing */
double (*new_mat)[new_size] = realloc(matrix, new_size*new_size*sizeof(double));
matrix[0][0] = 42;
matrix[new_size-1][new_size-1] = 24;

/* freeing */
free(new_mat);

是不是更簡單? 而且分配/釋放的速度快得多,因為它只是一種分配。 而且使用起來非常快,因為:

  • 它是一個連續的內存塊,因此對緩存友好
  • 您直接訪問該單元格,則對中間指針沒有數據依賴性。

請,當您需要2D數組時,請制作2D數組,而不是N-1D數組的1D數組到指針。

有兩個注意事項:1)如果要在調整大小時保留舊數據,則需要手動移動它; 2)編譯器必須支持C99。

兩個問題:

  1. 考慮以下來自重新分配代碼的行:

     pointer[i] = (double*)realloc(*(pMatrix+i), 2 * size * sizeof(double)); pointer[i] = (double*)malloc(size * sizeof(double)); 

    在第二個中,您分配的內存不如重新分配。

  2. 重新分配后,您可以釋放舊數據,但是已經通過realloc調用完成了。

無關緊要的是,在C中,您不應該malloc (或其同級對象)的結果

暫無
暫無

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

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