簡體   English   中英

為什么我的函數不能調整指針的內容,除非我返回一個指針來分配它

[英]Why doesn't my function work to adjust my pointer's content, unless i return one to assign it

我的問題是兩者之間有什么區別? 一個是空的,另一個是返回2d數組,但是它們執行相同的操作,但是功能似乎不相同嗎? 我一定是在誤解這里的指針。

我以為指針只存儲了指向地址的地址,所以如果我將指針作為參數傳遞,並更改內容和指向的位置,那我不像將其重新分配給函數返回值一樣。

在這兩個函數的末尾,我們都打印了第一行。 但是在通過Main中的void功能打​​印調整后的網格時,出現了段錯誤。

char    **ft_grid_gen(int size)
{
    char    **map;
    int     index;
    int     elem_index;
    int     sq_root;

    index = 0;
    elem_index = 0;
    sq_root = ft_sqrt(size * 4);
    map = (char**)malloc(sq_root * sizeof(char *));
    while (index < sq_root)
    {
        map[index] = (char*)malloc(sq_root * sizeof(char));
        while (elem_index < sq_root)
        {
            map[index][elem_index] = '.';
            elem_index++;
        }
        index++;
        elem_index = 0;
    }
    printf("GENERATED NEW GRID of size %s!\n", map[0]);
    return (map);
}
void    ft_grid_gen(char **map, int size)
{
    int     index;
    int     elem_index;
    int     sq_root;

    index = 0;
    elem_index = 0;
    sq_root = ft_sqrt(size * 4);
    map = (char**)malloc(sq_root * sizeof(char *));
    while (index < sq_root)
    {
        map[index] = (char*)malloc(sq_root * sizeof(char));
        while (elem_index < sq_root)
        {
            map[index][elem_index] = '.';
            elem_index++;
        }
        index++;
        elem_index = 0;
    }
    printf("GENERATED NEW GRID of size %s!\n", map[0]);
}

請注意, ft_grid_gen不僅ft_grid_gen更改為map點; 它還會更改map本身。

更改map對呼叫者的影響不超過更改size 無論您在調用ft_grid_gen用作參數的任何變量仍指向ft_grid_gen之后的“無用”。

如果要通過參數返回值,則需要將指針傳遞給將接收該值的變量。

void f(int *i_ptr) {
   *i_ptr = 123;
}

int i;
f(&i);

在您的情況下,這將是

void ft_grid_gen(char ***map_ptr, int size) {
   ...
   *map_ptr = map;
}

char **map;
f(&map);

或者,您可以在外部分配內存。 由於函數不再有需要改變map ,價值map可以直接傳遞。

void ft_grid_gen(char **map, int size) {
   ...
}

char **map = malloc(ft_sqrt(size * 4) * sizeof(char*));
ft_grid_gen(map, size);

(顯然,在這種特定情況下,這種方法遠非理想。)

不同之處在於,第一個函數返回的內容可供以后使用。 在第二個函數中,按值傳遞char** ,然后輸入:

map = (char**)malloc(sq_root * sizeof(char *));

您將新值分配給局部變量map ,該局部變量map是通過function參數分配的第一個值。 但是,這不會影響main()的原始char**變量-因為它是像C中的其他所有內容一樣通過值傳遞的。如果您想更改main()變量,則應該將指針傳遞給它(即char*** ),並在此函數中取消引用它,例如:

*map = (char**)malloc(sq_root * sizeof(char *));

暫無
暫無

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

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