Задать вопрос
@Razor98

Где теряю память?

Всем привет!

В общем я пока только начинаю своё знакомство с Си и от недавно имею дело со структурами...
Ну и вот сейчас пробую разобраться со списками:
Ошибка выкатывается на printf, но понятно, что с ним всё в порядке, просто запрашиваю я то, чего он не видит в памяти. Значит проблема в самом элементе.
Мог бы кто-нибудь мне тогда объяснить, почему я неправильно добавляю элемент списка?

Видно, что код учебный, поэтому просто: где не доучил матчасть?
Код представляю целиком, чтобы было яснее...

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


/* Определяем элемент списка */
typedef struct list_node {
    struct list_node *next;
    void *data;
    void *name;
    void *surname;
} list_node_t;

/* Определяем сам список */
typedef struct list {
    /* 
     * Размер списка хранить не обязательно, 
     * он нужен для упрощения работы 
     */
    int size;
    /* начало списка */
    list_node_t *head;
    /* конец списка */
    list_node_t *tail;
} list_t;

/* Инициализация массива */
list_t * create_list(void)
{
    list_t *lt = malloc(sizeof(list_t));

    lt->size = 0;
    lt->head = NULL;
    lt->tail = lt->head;

    return lt;
}

/* Добавляем элемент в начало списка */
void list_push(list_t *lt, void * data, void * name, void * surname)
{
    list_node_t * node = malloc(sizeof(list_node_t));
    node->data = data;
    node->name = name;
    node->surname = surname;    
    node->next = lt->head;

    lt->head = node;
    lt->size += 1;
}

/* Извлекаем элемент из начала списка */
void * list_pop(list_t *lt)
{
    if(lt->size == 0){
        /* Список пуст */
        return NULL;
    }

    list_node_t *node = lt->head;
    void * ret_val_I = node->data;
    void * ret_val_II = node->name;
    void * ret_val_III = node->surname;

    lt->size -= 1;
    lt->head = node->next;

    free(node);

    if(lt->size == 0){
        /* Это был последний элемент */
        lt->head = NULL;
        lt->tail = NULL;
    }

    return ret_val_I, ret_val_II, ret_val_III;
}

/* Добавляем элемент в конец списка */
void list_push_back(list_t *lt, void * data, void * name, void * surname)
{
    list_node_t * node = malloc(sizeof(list_node_t));
    node->data = data;
    node->name = name;
    node->surname = surname;   
    if(lt->tail != NULL)
        lt->tail->next = node;
    else {
        lt->head = node;
    }

    lt->tail = node;
    lt->size += 1;
}

void * list_print(list_t *lt)
{
	list_node_t *node;
	int i=0;
	    for(node = lt->head; node!=NULL; node = node->next)
	    {
		printf("%4d) %s %10s %4d \n", i, node->name, node->surname, node->data);
		i++;
	}
	printf("\n");
}

void * delete_after(list_node_t * node) {
	list_node_t * p;
	p = node -> next;
	node -> next = node -> next -> next;
	free(p);
}

void * search(list_t *lt, int x){	
	list_node_t * p;
	for(p = lt->head; p != NULL; p = p -> next)
		if(x == p -> data) return p;
		return NULL;
}

void * search_by_indeks(list_t *lt, int dl){	
	list_node_t * p;
	p = lt -> head;
		for(p != NULL; dl>0; dl--)
		{ 
		p = p -> next;
	}
	return p;
}


int main()
{
	
	list_t *st = create_list();

char c='N';	
printf("Czy dodajemy osobe do listy? Odpowiedz Y/N: "); 
///printf("Добавляем человека в список? Ответ Y/N: "); 
fflush(stdout);
scanf("%c", &c);
if(c=='Y')
{
	int data, *ptr_D;
	char name, *ptr_N;
	char surname, *ptr_S;
	printf("Podaj imie: ");
	scanf("%s", &name);
	printf("\n");
	printf("Podaj nazwisko: ");
	scanf("%s", &surname);
	printf("\n");
	printf("Podaj wiek: ");
	scanf("%s", &data);
	printf("\n");
	
	/* Добавляем в начало списка */
	list_push(st, data, name, surname); // I.
	
	list_print(st);
	printf("\n");
}
else list_print(st);
	

/* Извлекаем из начала списка*/
//ptr = (int *)list_pop(st);

	
	getchar();getchar();
	return 0;
}


  • Вопрос задан
  • 133 просмотра
Подписаться 1 Простой 3 комментария
Пригласить эксперта
Ответы на вопрос 1
vt4a2h
@vt4a2h
Senior software engineer (C++/Qt/boost)
где не доучил матчасть?

В части работы с памятью: выделение и очиска памяти, стек и куча, различие между массивом и одним элементом, время жизни объектов.
Например, вы читаете данные в элемент, который представляет собой один символ, выделенный на стеке. Вам же нужен буфер достаточно размера, лучше всего выделенный динамически, т.к. вы его потом собираетесь хранить в какой-то структуре данных.
Рекоменду вдумчиво прочитать K&R и выполнить все примеры. Это очень маленькая книжка, которая закроет все ваши пробелы в плане языка С.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы