簡體   English   中英

函數和返回指針中2D數組的C動態分配

[英]C dynamic allocation of a 2D array in a function & return pointer

我想用一些參數調用一個函數,並在此函數內分配一個2D數組,然后將其指針傳遞回main。 這不是我正在使用的實際代碼,而是一個簡化的“玩具”代碼來解釋我正在嘗試的代碼。 我遇到了段錯誤,但我不太明白為什么。 我以前做過這樣的事情,我認為這會起作用。 知道我搞砸了嗎?

void func(int val, int ** array);
int main()
{
    int **array;
    int i = 2;

    func(i,array);

    // do some stuff with info from array[i][2]

    free(array);
}

void func(int val, int **array)
{

    // do some calculation here to find the row size for array

    array = malloc(row_size*sizeof(int *));
    for (i = 0; i < row_size; i++)
        array[i] = malloc(2* sizeof(int));

// fill the 2d array with some values


}

您需要將指針傳遞給您的int **array; 指針。 因此func將采用int ***arrayp參數。 以這種方式修改代碼:

void func(int rows, int ***arrayp);
int main()
{
    int **array;
    int rows = 2;

    func(rows, &array);

    // do some stuff with info from array[rows][2]

    free(array);
}

void func(int rows, int ***arrayp)
{
    // do some calculation here to find the row size for array
    *arrayp = malloc(rows * sizeof(int *));
    for (int i = 0; i < rows; i++)
        (*arrayp)[i] = malloc(2 * sizeof(int));  

    // fill the 2d array with some values
}

一種替代方法是更改func原型以return其分配的int **array

分配僅2個int的子數組似乎很愚蠢。 您打算使這些子數組動態化嗎? 然后,您需要跟蹤其分配的大小。

你能做的是

main()

int **array = func(i);

func()應該是

int **func(int row_size)
{
    int  **array = malloc(row_size * sizeof(int *));
    for (int i = 0; i < row_size; i++)
        array[i] = malloc(2 * sizeof(int));  

    // fill the 2d array with some values
    return array;
}

func()內部分配內存並返回數組。 否則,您需要在函數中傳遞需要修改的變量的引用,傳遞的是未初始化的值,並且在func()內部完成的更改在main()不可見。

您可以通過執行我所顯示的操作來避免傳遞參考。

您不應對真正的2D數組使用特殊功能。 自1999年以來,可以使它們具有可變范圍。

您在這里擁有的不是2D數組而是指針數組。 這是兩件事。 除非確實有特定的原因使用指針指向數組,否則不要這樣做。 它易於出錯且效率較低。

對於真正的2D數組,它看起來就像

int (*array)[n] = malloc(sizeof(int[n][n]));

// use the array as you like

free(array);

暫無
暫無

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

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