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

Inicjalizacja listy dwukierunkowej

Object Storage Arubacloud
0 głosów
207 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,396 wizyt
pytanie zadane 28 stycznia 2017 w C i C++ przez Łukasz Świtaj Użytkownik (520 p.)
0 głosów
2 odpowiedzi 625 wizyt
0 głosów
1 odpowiedź 309 wizyt

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...