Как исправить проблему выделения памяти в функции ниже?(ТаНос) - PullRequest
1 голос
/ 28 апреля 2019

Мне нужно прочитать файл .txt и выделить каждое слово из файла в структуре, которая указывается из вектора структур.Я объясню лучше ниже.

Я ценю вашу помощь.

Моя программа выделяет только первое слово файла ...

Я знаю, что проблема в том,в функции insere_termo (), потому что я протестировал функцию fscanf, вызывающую функцию, и она работает нормально.

STRUCTS

typedef struct _item
{
int conta; //contador
char *termo; //palavra
} Item;

typedef struct _mapa
{
int total; // número de itens no mapa
int blocos; // número de blocos de itens alocados
Item **lista; // vetor de ponteiros para itens
} Mapa;

MAIN

int main()
{
    Mapa mp;
    FILE *arq;
    int i, result, numPalavras;
    float x;
    int valor, max, min, mincar;
    char caminho[20];
    char termo[40];
    int tam;

    inicia_mapa(&mp);

    valor = menu();

ЗДЕСЬ ВАЖНАЯ ЧАСТЬ МОЕГО КОДА.ГДЕ Я ЧИТАЮ ФАЙЛ В ПУТИ, предоставленный ПОЛЬЗОВАТЕЛЕМ, и НАЗЫВАЮ ФУНКЦИЮ insere_termo();, ОТВЕТСТВЕННАЯ ЗА ВЫДЕЛЕНИЕ КАЖДОГО СЛОВА В struct.

switch (valor)
    {
    case 1:
        printf ("*Ler Arquivo* \n");
        printf("Digite caminho: ");
        scanf("%s", caminho);

        arq = fopen(caminho,"r"); // abrir arquivo no caminho especificado
            if (arq == NULL)
            {
                 printf("Erro, nao foi possivel abrir o arquivo\n");
            }

         while(fscanf(arq, "%s", termo) != EOF)
        {
        //Adiciona cada palavra no vetor
        insere_termo(&mp, termo);
        }

    break;

ФУНКЦИИ

INICIA_MAPA () - ФУНКЦИЯ, КОТОРАЯ ОТВЕТСТВЕННА ЗА ИНИЦИАЦИЮ КАРТЫ, РАСПОЛОЖЯ БЛОК ИЗ 10 УКАЗАТЕЛЕЙ СТРУКТУРА «ПУНКТ».

INSERE_TERMO () - ФУНКЦИЯ, КОТОРАЯОТВЕТСТВЕННО ЗА ВЫДЕЛЕНИЕ СЛОВ, ПРЕДСТАВЛЕННЫХ ТЕКСТОВЫМ ФАЙЛОМ.НЕСКОЛЬКО ПРОБЛЕМА С РАСПРЕДЕЛЕНИЕМ ПАМЯТИ, НО Я НЕ МОГУ ВИДЕТЬ ЕГО.ЛЮБАЯ ПОМОЩЬ ПРИВЕТСТВУЕТ.

void inicia_mapa (Mapa *mp) //inicia um mapa vazio
{
    mp->lista = (Item**)malloc(BLOCK*sizeof(Item*));
    mp->total = 0;
    mp->blocos = 1;
}

void insere_termo (Mapa *mp, char *s) // insere um item com termo s e conta = 1
{

    if ((mp->total != 0)&&((mp->total%BLOCK) == 0))
    {
        mp->lista = (Item**)realloc(mp->lista,(mp->blocos+1)*BLOCK*(sizeof(Item*)));
        mp->blocos++;
    }

    mp->lista[mp->total] = (Item*) malloc(sizeof(Item)); // alocação dinâmica de item no mapa

    if (mp->lista[mp->total] == NULL)
    {
        printf("Erro na alocacao de memoria\n");
        exit(0);
    }

    strcpy(mp->lista[mp->total]->termo, s); // Insere termo s
    printf("%s\n", mp->lista[mp->total]->termo);
    mp->lista[mp->total]->conta++;
    mp->total++; // contagem do total

}

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

strcpy(mp->lista[mp->total]->termo, s); завершается ошибкой, поскольку mp->lista[mp->total]->termo еще не присвоено значение. Передача неинициализированного указателя p p в strcpy(p, ...) означает неопределенное поведение (UB).

Вместо этого выделите память, затем скопируйте с помощью strcpy()

// strcpy(mp->lista[mp->total]->termo, s);
p->lista[mp->total]->termo = malloc(strlen(s) + 1);
strcpy(p->lista[mp->total]->termo, s);
// or
p->lista[mp->total]->termo = strdup(s);

Обязательно освободите память, когда закончите.


Могут существовать другие проблемы.

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

@ chux большое спасибо!Это сработало.

функция обновлена:

void insere_termo (Mapa * mp, char * s) // элемент элемента com termo se conta = 1 {

if ((mp->total != 0)&&((mp->total%BLOCK) == 0))
{
    mp->lista = (Item**)realloc(mp->lista,(mp->blocos+1)*BLOCK*(sizeof(Item*)));
    mp->blocos++;
}

mp->lista[mp->total] = (Item*) malloc(sizeof(Item)); // alocação dinâmica de item no mapa

if (mp->lista[mp->total] == NULL)
{
    printf("Erro na alocacao de memoria\n");
    exit(0);
}

mp->lista[mp->total]->termo = strdup(s); // Insere termo s
printf("%s\n", mp->lista[mp->total]->termo);
mp->lista[mp->total]->conta++;
mp->total++; // contagem do total

}

...