Проблемы при динамическом распределении памяти для функции чтения ввода - PullRequest
1 голос
/ 31 марта 2020

У меня проблемы с функцией, которая должна читать строку от пользователя. Я всегда получаю (null) в качестве вывода.

Является ли это даже "правильным" подходом для такого рода проблем?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int getString(char *input);

int main(void)
{
        char *arr = NULL;
        printf("please enter string: ");
        getString(arr);
        printf("%s", arr);
        return 0;
}

int getString(char *input)
{
        int i;
        char c;
        char *tmp;
        input = malloc(sizeof(char));
        for (i = 0; (c = getchar()) != EOF && c != '\n'; ++i) {
                tmp = realloc(input, (i + 2) * sizeof(char));
                if (tmp == NULL) {
                        free(input);
                        printf("allocation error");
                        return -1;
                }
                input = tmp;
                input[i] = c;
        }
        input[i] = '\0';
        return 0;
}

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Если вы хотите динамически выделить строку, вам нужно передать указатель на char*, а не просто char *. Таким образом, функция может изменить действительный указатель char *, и вызывающая сторона увидит результат. В вашем текущем коде переменная input существует только внутри функции и не влияет на переменную, используемую вызывающей стороной, поэтому ваш arr остается неизменным (NULL).

Примерно так:

int getString(char **input)
{
        int i;
        char c;
        char *tmp, *cur = NULL;

        // No initial malloc() needed here.
        // Let realloc() do the job passing NULL the first time.

        for (i = 0; (c = getchar()) != EOF && c != '\n'; ++i) {
                tmp = realloc(cur, (i + 2) * sizeof(char));
                if (tmp == NULL) {
                        free(cur);
                        printf("allocation error");
                        return -1;
                }
                cur = tmp;
                cur[i] = c;
        }

        cur[i] = '\0';
        *input = cur;
        return 0;
}

А затем передать параметр следующим образом:

getString(&arr);
0 голосов
/ 31 марта 2020

Вы должны вернуть указатель input, поскольку он является локальным для вашей функции и освобождается, когда программа выходит из функции, поэтому в main arr по-прежнему NULL.

* 1006. *
...