簡體   English   中英

使用指針數組初始化 C 中的二維數組

[英]Initialize 2D array in C using array of pointers

我有一個 static 數組,我想用它來使用指針初始化動態數組。

現在我有這個:

boardinit[BOARD_HEIGHT][BOARD_LENGTH] = {
        {-4, -2, -3, -5, -6, -3, -2, -4},
        {-1, -1, -1, -1, -1, -1, -1, -1},
        {0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0},
        {1, 1, 1, 1, 1, 1, 1, 1},
        {4, 2, 3, 5, 6, 3, 2, 4},
    };
int main()
{
    int board[BOARD_HEIGHT][BOARD_LENGTH]; 
    initboard(board);

    for (int j = 0; j < BOARD_HEIGHT; j++)
    {
        for (int i = 0; i < BOARD_LENGTH; i++)
            printf("%d ", board[j][i]);
        printf("\n");
    }
    return 0;
}

void initboard(int (*pboard)[BOARD_HEIGHT]) 
{
    for(int i = 0;i<BOARD_HEIGHT;i++)
        pboard[i] = boardinit + i;

}

我希望board[BOARD_HEIGHT][BOARD_LENGTH] BOARD_LENGTH] 通過使用指針將 board 傳遞給initboard()來初始化為boardinit[BOARD_HEIGHT][BOARD_LENGTH] ,但似乎無法將其傳遞給 go。

要將內容boardinit復制到board的值,只需使用以下命令:

memcpy(board, boardinit, sizeof(board));

如果這不起作用,請嘗試以下操作:

void initboard(int pboard[BOARD_HEIGHT][BOARD_LENGTH]) {
    for (int i = 0; i < BOARD_HEIGHT; i++)
        for (int j = 0; j < BOARD_LENGTH; j++)
            pboard[i][j] = boardinit[i][j];
}

“我有一個 static 數組,我想用它來使用指針初始化一個動態數組。”

arrays 指針的問題在於,每次調用[m][c]alloc()都不能保證(實際上不太可能)提供 memory 的單個連續塊。 即,這是提供 memory 的許多小區域的常用方法:

int **array = malloc(sizeof(width * sizeof(int *));
{
     for(int i=0; i<width; i++)
     {
          array[i] = malloc(height*sizeof(int));
     }
}

因此,初始化程序需要分成幾個 memory 塊位置。

一種更簡單、更有效的方法是使用單個動態 memory 分配調用,保證 memory 的單個連續塊,然后可以使用初始化器到從[m][c]alloc()返回的指針位置執行單個memcpy() [m][c]alloc() 那么唯一的問題是如何使用數組表示法訪問 memory 區域。 下面的示例說明了如何使用*(ptr + index)表示法來完成...

//assuming your other code above
int main(void) 
{   
    int elements = BOARD_HEIGHT*BOARD_LENGTH;
    int *pArray = calloc(elements, sizeof(int));
    if(pArray)
    {
        memcpy(pArray, boardinit, sizeof boardinit);
        for(int i=0; i<BOARD_HEIGHT;i++)
             for(int j = 0;j<BOARD_LENGTH;j++)
                printf("%d\n", *(pArray + (i + j)));
        free(pArray);
    }
 
    return 0;
}

暫無
暫無

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

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