Przydzielanie pamięci dla struktury, dla której elementów też trzeba przydzielić pamięć

0

Witam,

Mam sobie taką strukturę:

    struct human {
        int age;
        char *name;
        char *surname;
        struct human *next;
    };

W programie dalej za pomocą malloc() przydzielam pamięć dla name i surname tworząc stringa. Zastanawia mnie jak przydzielić pamięć dla samej struktury (gdy tworzę kolejny egzemplarz), gdyż zwykłe sizeof(struct human) raczej nie wystarczy, bo w danym momencie program nie wie, ile miejsca zajmą name i surname. Jak sobie z tym poradzić?

0

To nie tak. Struktura przechowuje wskaźnik, który zwykle zajmuje 4 lub 8 bajtów. sizeof(struct human) jest prawidłowe, ale musisz pamiętać o osobnym przydzieleniu pamięci dla poszczególnych pól

0

A rzeczywiście, super - dzięki wielkie ;)

Mam jeszcze jedno pytanie. Żeby funkcja insert działała muszę jej przekazać wskaźnik do wskaźnika do struktury. Dlaczego nie działa wersja z samym wskaźnikiem do struktury?

struct human *insert(struct human **p, int age, char *name, char *surname) {

    struct human *ptr = (struct human*)malloc(sizeof(struct human));
    ptr->name = (char *)malloc(sizeof(char)*(strlen(name)+1));
    ptr->surname = (char *)malloc(sizeof(char)*(strlen(surname)+1));

    strcpy(ptr->name, name);
    strcpy(ptr->surname, surname);
    ptr->age = age;
    ptr->next = *p;
    *p = ptr;

    return *p;

}
struct human *insert(struct human *p, int age, char *name, char *surname) {

    struct human *ptr = (struct human*)malloc(sizeof(struct human));
    ptr->name = (char *)malloc(sizeof(char)*(strlen(name)+1));
    ptr->surname = (char *)malloc(sizeof(char)*(strlen(surname)+1));

    strcpy(ptr->name, name);
    strcpy(ptr->surname, surname);
    ptr->age = age;
    ptr->next = p;
    p = ptr;

    return p;

}
0
Bent napisał(a)

A rzeczywiście, super - dzięki wielkie ;)

Mam jeszcze jedno pytanie. Żeby funkcja insert działała muszę jej przekazać wskaźnik do wskaźnika do struktury. Dlaczego nie działa wersja z samym wskaźnikiem do struktury?

z tego samego powodu, dlaczego nie działa ta funkcja:

void podstawInta(int dest, int a)
{
    dest=a;
}

int main(int argc, char **argv)
{
    int b ;
    b=100 ;
    podstawInta(b,-1) ;

    return 0 ;
}

poprawiona wersja w C++:

void podstawInta(int &dest, int a)
{
    dest=a;
}

i w C:

void podstawInta(int *dest, int a)
{
    *dest=a;
}
int main(int argc, char **argv)
{
    int b ;
    b=100 ;
    podstawInta(&b,-1) ;

    return 0 ;
}
0

Masz rację, już wiem, gdzie robię błąd. Żeby program działał tak jak chcę, to później w mainie musiałbym mieć coś takiego:

struct human *ptr = NULL;
ptr = insert(ptr, bla, bla, bla);
ptr = insert(ptr, bla, bla, bla);

Mam rację? :) Bo inaczej rzeczywiście to wszystko przepada. Dzięki za pomoc!

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0