(решено) Кто-нибудь знает, почему моя программа падает?

Я пытаюсь динамически выделить слова прямо из txt-файла для дальнейшего использования, но после ввода имени файла программа вылетает и возвращает отрицательное значение (CodeBlocks). Вот код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define L 18
#define F 50    
int main()
    {
        char **text = NULL;
        int wcount=0;
        text = textInput(&wcount);
        free(text);
    
        return 0;
    }
    
    char** textInput(int *wcount)
    {
        FILE *loadfile;
        char fname[F];
        char *word;
        char **text;
        printf("\nType the file of the name you would like to load: ");
        scanf("%49s", fname);
        strcat(fname, ".txt");
        if ((loadfile = fopen(fname, "rt")) == NULL)
            perror("Cannot open file");
        while(fscanf(loadfile,"%18s", word = (char*)malloc(L*sizeof(char)))!= EOF)
        {
            (*wcount)++;
            text = (char**)realloc(text, (*wcount)*sizeof(char *));
            text[(*wcount)-1] = word;
        }
        fclose(loadfile);
        free(word);
        return text;
    }

Не могли бы вы отредактировать вопрос, указав тег используемого вами языка, а не C#?

Joe Sewell 13.05.2022 21:18

Какова ценность F?

Lasse V. Karlsen 13.05.2022 21:20

мой плохой, я думал, что C# был подходящим тегом для c

humbleprogrammer 13.05.2022 21:21

забыл добавить все строки #include и #define

humbleprogrammer 13.05.2022 21:23

Используйте свой отладчик. Шаг через код. Первый шаг: ВЫ ДОЛЖНЫ ОПРЕДЕЛИТЬ КОНКРЕТНУЮ ЛИНИЮ, В КОТОРОЙ НЕИСПРАВНА. Вам нужно точно знать, что какая дает сбой (какая строка) и, в идеале, Зачем (например, нарушение сегментации). Использование отладчика является хорошим способом сделать это.

paulsm4 13.05.2022 21:25

Ошибка на единицу: "%18s" должно быть "%17s", но с "%49s" все получилось.

Weather Vane 13.05.2022 21:26

Отвечает ли это на ваш вопрос? Отладка ошибки сегментации в программе C

PiRocks 13.05.2022 21:33

будьте осторожны с fname. Хорошо, что вы думаете о том, чтобы оставаться в рамках с %49s, но потом вы идете и пристегиваете .txt к этому. Если пользователь превысит 49, произойдет переполнение.

yano 13.05.2022 21:45

спасибо за советы, я решил проблему, оказывается, я пропустил инициализацию текстового указателя, как указывает первый ответ

humbleprogrammer 13.05.2022 21:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
9
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В функции textInput вы не инициализировали text перед вызовом realloc(text, ...). Добавьте инициализацию text = NULL перед вызовом realloc. Например.

char **text = NULL;

У вас уже есть такая строка в main(), но в main() это не имеет значения, переменная text в main() не совпадает с переменной text в textInput(). (Кроме того, в main() вы переназначаете text, прежде чем пытаться его использовать, поэтому инициализация text в NULL не требуется.)

Черт, кажется, проблема была в этом, большое спасибо, что указали на это, нужно было изучить это подробнее.

humbleprogrammer 13.05.2022 21:35

Другие вопросы по теме