c语言 - 为什么我的函数无法调整指针的内容,除非我返回一个来分配它



我的问题是这两个区别是什么?一个是一个空隙,另一个是返回2D数组,但是它们也这样做,但是功能似乎没有做到吗?我必须在这里误解指针。

我以为Pointers只存储了一个地址,因此,如果我以参数为参数,然后更改内容和指向点的位置,我是否会与将其重新分配给函数返回相同值。

在两个函数的末尾,我们打印了第一行,它们都在这两个函数上都这样做。但是,当我的主体中通过void函数打印调整后的网格时,我得到了一个segfault。

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]);
}

区别在于,第一个功能返回您以后可以使用的东西。在第二个功能中,您按值将char**传递,然后以:

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

您将新值分配给本地变量map,该值通过函数参数分配了其第一个值。但是,这不会影响main()中的原始char**变量 - 因为它像C中的其他所有内容一样通过值传递,如果您想更改main()变量,您将通过一个指针(即char***(和DE-将其传递给它。在此功能中引用它,例如:

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

请注意,ft_grid_gen不仅将其更改为map点;它还更改map本身。

更改map对呼叫者没有更改size的影响。您用作呼叫者中的参数的任何变量仍然指向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);

(显然,在这种特定情况下,这种方法远非理想。(

相关内容

最新更新