首页 > 解决方案 > 为什么我的函数不能调整指针的内容,除非我返回一个来分配它

问题描述

我的问题是这两者有什么区别?一个是 void,另一个返回 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]);
}

标签: cpointersmemory

解决方案


请注意,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);

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


推荐阅读