Struktury, dealokacja

0

Napisz odpowiedni prototyp funkcji inicjalizacja_OSOBA(), która dla podanych argumentów (inicjalizuje strukturę odpowiednimi danymi. Wykorzystaj funkcję malloc() aby przydzielić odpowiednią ilość miejsca w strukturze na przechowanie łańcuchów oznaczających imię, nazwisko...
Mam tu napisaną funkcję alokacja, nie jestem pewnien czy jest ok, i mam napisać funkcję dealokacja która dealokuje pamieć przypdzeiloną przez alokacja_OSOBA, no i nie bardzo wiem jak to zrobić, co się stanie jak dam instrukcję free(tab[i]),to co się stanie, czy musze uwalniać wszystko osobno....

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

OSOBA inicjalizacja_OSOBA(OSOBA* structer,char* tab_imie,char* tab_nazwisko,char* tab_miejscowosc,int age)
{
    (*structer).wiek = age;
    (*structer).imie = malloc(sizeof(tab_imie));
    (*structer).imie = tab_imie;


return* structer;
}

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')
            ;
        dane[i]=inicjalizacja_OSOBA(&dane[i], tab_imie, tab_nazwisko,
                                     tab_miejscowosc, age);
        i++;
    }
    printf("Podaj, ktory rekord tablicy dane chcesz wyswietlic.\n");

  //  for (int i = 0; i < MAX; i++)
   //     dealokacja_OSOBA(&dane[k]);


    return 0;
}
0

Tak w ogóle to ten fragment kodu mija się z Twoim celem:

    (*structer).imie = malloc(sizeof(tab_imie));
    (*structer).imie = tab_imie;

Najpierw robisz tak: alokuję pamięć na obszar o pewnym rozmiarze. W tym momencie pokazuję wskaznikiem imię na ten obszar. Ale już w następnym kroku pokazuję wskaznikiem na przakazany przez parametr adres tab_imie.
Wniosek? Zaalokowałem miejsce, którego nie uzywam.
Tutaj rozwiązaniem jest alokacja miejsca i skopiowanie zawartosci spod adresu tab_imie do zaalokowanego obszaru.

Swoich tablic pomocniczych nie musisz dealokować, bo są tworzone na stosie. Nie były alokowane dynamicznie, więc nie ma sensu tego robic.
Zasada jest taka free() używasz tyle samo razy ile alloc/malloc i wtedy zawsze będzie dobrze.

0

Warto zwrócić uwagę jeszcze na to, że tutaj:

(*structer).imie = malloc(sizeof(tab_imie));

zostanie zaalokowane tyle ile ma bajtów wskaźnik, nie dane, które są wskazywane przez ten wskaźnik.

0

czekaj czekaj, jak przekazać wartość tablicy a nie jej wskażnik bo nie bardzo wiem.
no właśnie a co z tmy free bo nie wiem jak zrobić tą dealokacje

2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 30
#define MAX 10

typedef struct osoba {
    char *imie;
    char *nazwisko;
    char *miejscowosc;
    int wiek;
} OSOBA;
 
void inicjalizacja_OSOBA(OSOBA *structer, char *tab_imie, char *tab_nazwisko, char *tab_miejscowosc, int age)
{
    structer->imie = malloc(strlen(tab_imie) + 1);
    strcpy(structer->imie, tab_imie);

    structer->nazwisko = malloc(strlen(tab_nazwisko) + 1);
    strcpy(structer->nazwisko, tab_nazwisko);

    structer->miejscowosc = malloc(strlen(tab_miejscowosc) + 1);
    strcpy(structer->miejscowosc, tab_miejscowosc);

    structer->wiek = age;
}

void dealokacja_OSOBA(OSOBA *structer)
{
    free(structer->imie);
    free(structer->nazwisko);
    free(structer->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");
    // ...
 
    for (i = 0; i < MAX; i++) {
        dealokacja_OSOBA(&dane[i]);
    }
 
    return 0;
}

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