Struktury i alokowanie

0

Witajcie. Moglibyście powiedzieć czy to zadanie wykonałem prawidłowo. W przypadku złego rozwiązania byłbym wdzięczny za wskazówki :)
Zadanie:
Proszę napisać program w którym:

  • zdefiniowany zostanie typ strukturalny o nazwie osoba z
    następującymi polami:
    1 char * nazwisko
    2 char * imie (pola dynamicznie alokowane)
  • zdefiniowana zostanie zmienna ws_osoba typu wskaźnik do osoba a następnie przydzielona zostanie jej dynamicznie pamięć
    -od użytkownika pobrane zostaną dwa łańcuchy znaków: Nazwisko i Imię i umieszczone we właściwych polach struktury (jako dynamicznie za-alokowane zasoby)
  • następnie proszę wyświetlić adresy: struktury i jej pól, wyświetlić zawartość struktury, zwolnić przydzieloną dynamicznie pamięć

I oto mój kod :

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

struct person{
char *last_name;
char *name;
};

struct person *p_person;

int main(void)
{

p_person=malloc(sizeof(struct person));
p_person->last_name=malloc(sizeof(struct person));
if (p_person->last_name == NULL){
    fprintf(stderr, "error in malloc");
    exit(1);
}
p_person->name=malloc(sizeof(struct person));
if (p_person->name == NULL){
    fprintf(stderr, "error in malloc");
    exit(1);
}
puts("Proszę podać nazwisko i imię:");
scanf("%s", p_person->last_name);
scanf("%s", p_person->name);

printf("%s %s\n", p_person->last_name, p_person->name);
printf("Adres nazwiska:%p\nAdres imienia:%p", p_person->last_name, p_person->name);

free(p_person);
free(p_person->last_name);
free(p_person->name);

return 0;

}

0
struct person {
char last_name;
char name;
};

Jeżeli last_name oraz name mają być dynamicznie alokowane należy zadeklarować je jako wskaźniki:

char* last_name;
char* name;

Twoja konstrukcja tutaj:

p_person->last_name=malloc(sizeof(struct person));

jest nieprawidłowa dlatego że last_name nie jest strukturą person.

Możesz użyć getline który zadeklaruje pamięć za ciebie (przykład z innego problemu na tym forum):

int main()
{
    char *line = NULL; 
    size_t nbytes = 0;
    // Powyższe zmienne zostaną zaktualizowane po zaalokowaniu pamięci
 
    printf("Podaj ciag znakow: \n");
    int bytes_read = getline(&line, &nbytes, stdin);
    if(bytes_read == -1)
    {
        // Błąd
    }
    else
    {
        printf("%s", line); // Wypisz to co wpisał użytkownik.
    }
    free(line); // Zwolnij zarezerwowany obszar pamięci.
    return 0;
}

Gdzie line* w twoim wypadku to last_name oraz name.

0

Te wskaźniki miałem tylko się nie skopiowały. A nie da rady w prostszy sposób tego zapisać przy użyciu malloc i sizeof ?

0

Dlatego wkleja się kod w odpowiednie znaczniki:
```c
[ tutaj kod ]
```

Ale odpowiadając na pytanie - mógłbyś zadeklarować odpowiednio dużą tablice np.

p_peron -> name = (char*)malloc(sizeof(char) * 100);

Poza tym jeszcze - źle zwalniasz pamięć bo próbujesz się odwołać do p_person którego już nie ma. Prawidłowa kolejność

free(p_person->last_name);
free(p_person->name);
free(p_person);
0

Cos jeszcze do poprawy?

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

struct person{
        char *last_name;
        char *name;
    };

struct person *p_person;

int main(void)
{

    p_person=malloc(sizeof(struct person));
    p_person->last_name=(char*)malloc(sizeof (char)*100));
    if (p_person->last_name == NULL){
        fprintf(stderr, "error in malloc");
        exit(1);
    }
    p_person->name=(char*)malloc(sizeof (char)*100);
    if (p_person->name == NULL){
        fprintf(stderr, "error in malloc");
        exit(1);
    }
    puts("Proszę podać nazwisko i imię:");
    scanf("%s", p_person->last_name);
    scanf("%s", p_person->name);

    printf("%s %s\n", p_person->last_name, p_person->name);
    printf("Adres nazwiska:%p\nAdres imienia:%p", p_person->last_name, p_person->name);

   
    free(p_person->last_name);
    free(p_person->name);
    free(p_person);

    return 0;
}
0
p_person->last_name=(char*)malloc(sizeof (char)*100)); // 2 linia w main

Masz niepotrzebny nawias na samym końcu. Poza tym jest ok.

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