Crear listas de string

Estoy tratando de copiar las palabras de un file .txt en una lista enlazada. Escribì algo pero lo que pasa es que el programa se cierra en un momento, como si hubiera un error el la asignaciòn de la memoria. No entiendo donde me estoy equivocando.

#include <stdio.h>
#include <stdlib.h>
struct s_nodo
{
    char* palabra;
    struct s_nodo*sig;
};
typedef struct s_nodo* t_nodo;

void agregar (t_nodo*,char*);
void imprimir(t_nodo);

int main()
{
    char aux[30];
    t_nodo lista=NULL;
    FILE*fd;
    fd=fopen("c:\\texto.txt","r");
    while(!feof(fd))
    {
        fscanf(fd,"%s",aux);
        agregar(&lista,aux);

    }
     imprimir(lista);
    return 0;
}


void agregar (t_nodo*lista,char *aux)
{

    if(*lista==NULL)
    {
        *lista=malloc(sizeof(t_nodo));
        (*lista)->palabra=malloc((strlen(aux+1))*sizeof(char));
        strcpy((*lista)->palabra,aux);
        (*lista)->sig=NULL;

    }
    else agregar(&(*lista)->sig,aux);    
}

void imprimir (t_nodo lista)
{
    if(lista!=NULL)
    {
        printf("-%s-",lista->palabra);
        imprimir(lista->sig);
    }
}
3
задан 17.03.2016, 11:37
2 ответа

Как хорошо ты говоришь, есть ошибка в ассигновании памяти, в частности во втором malloc внутри функции agregar:

(*lista)->palabra=malloc((strlen(aux+1))*sizeof(char));

Проблема - в strlen где ты делаешь strlen(aux+1), и то, что ты был бы должен делать, strlen(aux)+1. Он делает уже многий, что я не работаю с указателями в C, так что возможно, что я ошибаюсь, но если я не помню плохо: сделав aux+1 действительно ты пробуешь соглашаться на следующую ячейку запоминающего устройства с aux, и тогда результат strlen(aux+1) это не тот, что ты ждешь, создавая проблемы памяти во время выполнения.

Исправив эту линию в:

(*lista)->palabra=malloc((strlen(aux)+1)*sizeof(char));

программа работает без проблем.

2
ответ дан 24.11.2019, 14:55

Ошибка находится в линии:

(*lista)->palabra=malloc((strlen(aux+1))*sizeof(char));

из тебя mГ©todo добавлять:

void agregar (t_nodo*lista,char *aux)
{
    if(*lista==NULL)
    {
        *lista=malloc(sizeof(t_nodo));
        //(*lista)->palabra=malloc((strlen(aux+1))*sizeof(char)); //Error!
        (*lista)->palabra=malloc(strlen(aux)+1); // Corrige error.
        strcpy((*lista)->palabra,aux);
        (*lista)->sig=NULL;

    }
    else agregar(&(*lista)->sig,aux);
}

, Чтобы поселять память Гєnicamente, ты нуждаешься: malloc( ), не необходим *sizeof(char)

0
ответ дан 24.11.2019, 14:55
  • 1
    Относительно нее и #250; ltima l и # 237; nea, это эксперт и # 237; потому что char est и # 225; гарантированный, что он занимает точно 1 байт. Для любого другого типа t, s и # 237; необходимо умножать из-за tama и # 241; или t, чтобы размещать x элементы: malloc (x * sizeof (t)). Схвати и # 237; в любом случае, я изменять и # 237; в нее l и # 237; nea, чтобы говорить " Чтобы размещать память для символов (char), и #250; nicamente ты нуждаешься (...) " – Baltasarq 14.02.2016, 13:39