• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Inicjalizacja listy dwukierunkowej

Mały hosting, OGROMNE możliwości
0 głosów
306 wizyt
pytanie zadane 4 kwietnia 2017 w C i C++ przez chacken Użytkownik (820 p.)

Chyba czegoś nie ogarniam ze wskaźnikami... ktoś mógłby mi wskazać błąd?
head.h
 

#ifndef HEAD_H_INCLUDED
#define HEAD_H_INCLUDED

typedef struct dane Dane;
typedef struct lista Lista;
void clearIn();
void endl();
void init(Lista *);
void addBegining(Lista *);

#endif // HEAD_H_INCLUDED

fn.c
 

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

struct dane {
    char *imie, * nazwisko;
    int pesel;
    Dane *next, *prev;
};

struct lista {
    Dane *head, *tail;
    unsigned count;
};

void clearIn(){
     while(getchar()!='\n');
}

void endl(){
    printf("\n");
}

void init(Lista * start) {
    start -> head = NULL;
    start -> tail = NULL;
    start -> count = 0;
}

void addBegining(Lista *lista) {
    Dane *element = (Dane*)malloc(sizeof(Dane));
    char *imie = (char*)malloc(64*sizeof(char));
    printf("Podaj imie: ");
    gets(imie);
    char *nazwisko = (char*)malloc(64*sizeof(char));
    printf("Podaj nazwisko: ");
    gets(nazwisko);
    int pesel;
    scanf("%d", &pesel);
}

main.c
 

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

int main()
{
    Dane *my_list;
    Lista *start;
    init(start);
    printf("Lista dwukierunkowa\n\n");
    printf("a. dodaj do listy\tb. wyswietl liste\n");
    switch(getchar()){
    case 'a':
    case 'A':
        addBegining(start);
        break;
    }
}

Chodzi mi knokretnie o funkcję init. Która ma inicjalizować listę. W mainie tworzę wskaźnik start i chcę przekazać go do funkcji który zainicjalisuje tą listę zerami.  Jednak po włączeniu program crashuje.

Inna sprawa to w funkcji main chciałem zrobić coś takiego:
 

Lista *start = (Lista*)malloc(sizeof(Lista);

to dostaję zwrot z kompilatora:
"error: invalid application of 'sizeof' to incomplete type 'Lista {aka struct lista}'|"

Jak to ogarnąć? Co robię źle ;/?


EDIT. Może zdąże zanim ktos przeczyta:
char *imie = (char*)malloc(64*sizeof(char));

Takie cudo.... czy muszę tam określać że ma wielkość 64? Jak bym zrobił np. 
char *imie = (char*)malloc(sizeof(char));
to czy program sam będzie dostosowywać wielkość w zależności od tego co wpiszę? Czy raczej może być to niebezpieczne?

1 odpowiedź

0 głosów
odpowiedź 4 kwietnia 2017 przez .kassad Gaduła (3,420 p.)
wybrane 4 kwietnia 2017 przez chacken
 
Najlepsza
Przy wywoałaniu funkcji init, jako parametr podajesz wskaźnik, któremu nie przypisałeś żadnej pamięci. W tej funkcji musisz wywołać malloc przed inicjalizacją pól.

 

char *imie = (char*)malloc(sizeof(char)) zaalokuje dokładnie jeden bajt pamięci, czyli tyle ile wynosi rozmiar typu char. Jeżeli wiesz, że będziesz potrzebował więcej, musisz to 'powiedzieć' kompilatorowi np char *imie = (char*)malloc( 64 * sizeof(char)) i co ważne, musisz sam pilnować, żeby do zmiennej 'imie' nie mozna było wpisać nic dłuższego.

 

 

Lista *start = (Lista*)malloc(sizeof(Lista); a tu nie chodzi o niedomknięty nawias?

Podobne pytania

0 głosów
2 odpowiedzi 1,959 wizyt
pytanie zadane 28 stycznia 2017 w C i C++ przez Łukasz Świtaj Użytkownik (520 p.)
0 głosów
2 odpowiedzi 1,473 wizyt
0 głosów
1 odpowiedź 475 wizyt

93,715 zapytań

142,629 odpowiedzi

323,261 komentarzy

63,258 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...