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