Почему моя функция не работает для настройки содержимого моего указателя, если я не верну один, чтобы назначить его - PullRequest
0 голосов
/ 12 мая 2019

Мой вопрос: в чем разница между этими двумя?один является пустым, а другой возвращает 2-мерный массив, однако они делают то же самое, но функциональность, кажется, не делает то же самое?я, должно быть, неправильно понимаю указатели здесь.

Я думал, что указатели хранят только адрес, на который можно указать, поэтому, если я передам один в качестве параметра и изменит его содержимое и на то, куда он указывает, не делаю ли ятак же, как переназначение его возвращаемому значению функции.

в конце обеих функций мы печатаем первую строку, они сделали это в обеих.но во время печати скорректированной сетки с помощью функции void в моем Main я получаю ошибку 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]);
}

Ответы [ 2 ]

0 голосов
/ 12 мая 2019

Разница в том, что первая функция возвращает то, что вы можете использовать позже. Во второй функции вы передаете char** по значению, а затем с помощью:

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

Вы присваиваете новое значение локальной переменной map, которой было присвоено ее первое значение через параметр функции. Однако это не влияет на исходную переменную char** в main() - потому что она была передана по значению, как и все в C. Если бы вы хотели изменить переменную main(), вы бы передали указатель на нее ( т.е. char***) и разыменовали его в этой функции, например:

*map = (char**)malloc(sq_root * sizeof(char *));
0 голосов
/ 12 мая 2019

Обратите внимание, что 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);

(Очевидно, что этот подход далеко не идеален в данной конкретной ситуации.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...