Ошибка сегментации каждого третьего запуска моей программы, используя mallloc - PullRequest
0 голосов
/ 13 декабря 2018

Я получаю ошибку сегментации почти каждый третий раз, и я пытаюсь понять, почему.Я думаю, что причиной этого является неправильное использование malloc() и free().Я должен прочитать пользовательский ввод, а затем сохранить его в массиве с помощью malloc.Эта часть работала, пока как-то не начали появляться ошибки.

Мой код:

char *Input() {
    char user_input;
    int length;

    char *buffer = malloc(2 * sizeof(char));

    while (((user_input = getchar(stdin)) != EOF) && (user_input != '\n')) {
        buffer[length] = user_input;
        length++;
        char *buffer_new = realloc(buffer, length + 2);
        if (buffer_new != NULL) {
            buffer = buffer_new;
        } else {
            free(buffer);
            printf("Error.\n");
            return 1;
        }
    }

    buffer[length] = '\0'; 

    if (strlen(buffer) > 200) {
        printf("Error.\n");
        return 2;
    }

    return buffer;
}

Я не совсем уверен, где моя ошибка или почему ошибка происходит.Вот как я вызываю функцию:

int main() {
    char *input = Input();

    if (input == 1)
        return 1;
    if (input == 2)
        return 2;

    free(*input);

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Вы не присвоили значение length, это может быть любое значение.Если вам повезет, это не переполнится при использовании buffer[length], но не рассчитывайте на удачу.инициализируйте это.int length = 0;

0 голосов
/ 13 декабря 2018

Основная проблема, которую я вижу, заключается в том, что в вашем коде для функции Input(), length - это локальная переменная с автоматической продолжительностью хранения, которая не инициализируется явно.Таким образом, он содержит неопределенное значение.Таким образом, оператор

 buffer[length] = user_input;

обращается к неверному адресу памяти.Это вызывает неопределенное поведение .

. Вы должны явно инициализировать length в 0.

После этого знайте, что getchar() возвращаетint, а значение типа EOF не может вписаться в char.Вам необходимо изменить user_input на int.

Кроме того, в main() вы определили input как указатель,

char* input = Input();

, но высравнивая его со значением int, скорее всего, это не то, что вам нужно.

Вы должны сравнивать со значением, хранящимся в указателе, что-то вроде

if (*input == 1)
    return 1;
if (*input == 2)
    return 2;

и, наконец,Вы передаете указатель на free(), а не содержимое, поэтому измените

 free(*input);

на

 free(input);
...