Allokacja i delokacja pamieci w tablicach struktur

0

Prosze o pomoc w zadaniu musze napisac funkcje inicjalizacja_OSOBA(), dealokacja_OSOBA() oraz wyswietl lecz niestety nie działa mnie to poprawnie

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 30
#define MAX 2
typedef struct osoba{
 char *imie;
 char *nazwisko;
 char *miejscowosc;
 int wiek;
} OSOBA;

void inicjalizacja_OSOBA (OSOBA *dane, char *imie, char *nazwisko, char *miejscowosc, int wiek)
{

	dane->imie=(char*)malloc((strlen(imie)+1)*sizeof(char));
	dane->imie=imie;
	
	dane->nazwisko=(char*)malloc((strlen(nazwisko)+1)*sizeof(char));
	dane->nazwisko=nazwisko;
	
	dane->miejscowosc=(char*)malloc((strlen(miejscowosc)+1)*sizeof(char));
	dane->miejscowosc=miejscowosc;
	
	dane->wiek=wiek;
}

void wyswietl (OSOBA *dane)
{
	puts(dane->imie);
	puts(dane->nazwisko);
	puts(dane->miejscowosc);
	printf("%d \n", dane->wiek);
}

dealokacja_OSOBA(OSOBA *dane)
{
	free(dane->imie);
	free(dane->nazwisko);
	free(dane->miejscowosc);
	
}

int main(void)
{
 OSOBA dane[MAX];
 char tab_imie[N+1];
 char tab_nazwisko[N+1];
 char tab_miejscowosc[N+1];
 int i = 0, age, k;
 while (i < MAX)
 {
 printf("Podaj imie: ");
 gets(tab_imie);
 printf("Podaj nazwisko: ");
 gets(tab_nazwisko);
 printf("Podaj miejscowosc: ");
 gets(tab_miejscowosc);
 printf("Podaj wiek: ");
 scanf("%d", &age);
 while(getchar() != '\n');
 inicjalizacja_OSOBA(&dane[i], tab_imie, tab_nazwisko, tab_miejscowosc, age);
 i++;
 }
 printf("Podaj ktory rekord tablicy dane chcesz wyswietlic.\n");
 printf("Wyjscie poza idkeks tablicy lub wpisanie znaku nie bedacego liczba konczy wypisywanie!");
 while (scanf("%d", &k) == 1 && k >= 0 && k < MAX)
 {
 printf("Rekord %d\n", k);
 printf("--------------------------\n");
 wyswietl(&dane[k]);
 printf("--------------------------\n");
 while(getchar() != '\n');
 printf("Podaj ktory rekord tablicy dane chcesz wyswietlic.\n");
 printf("Wyjscie poza idkeks tablicy lub wpisanie znku nie bedacego liczba konczy wypisywanie!\n");
 }
 for(i = 0; i < MAX; i++)
 dealokacja_OSOBA(&dane[i]);
 printf("KONIEC!");

 return 0;
}  
2

musisz skopiować zawartość tablic do których wprowadzasz ciąg znaków (dane), a nie ich adres (stąd te same wartości):

dane->imie = (char*)malloc((strlen(imie)+1)*sizeof(char));
strcpy(dane->imie, imie);

lub zamiast tych dwóch to:

dane->imie = strdup(imie);

oczywiście to samo dla nazwisko, miejscowosc.

PS. co zwraca funkcja dealokacja_OSOBA?

0

funkcja dealokacja_OSOBA jest typu void bo nic nie powinna zwracać tylko usuwać za alokowaną pamięć, dziękuje bardzo teraz raczej wszystko działa dobrze.

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