Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

malloc di struct

32 views
Skip to first unread message

NERO23

unread,
May 5, 2013, 7:28:00 AM5/5/13
to
Con il codice che ho riportato sotto (ᅵ solo un esempio...), nella
memoria heap viene memorizzato solo l'indirizzo del nome mentre Mario ᅵ
memorizzato nello stack?

nero23





#include <stdio.h>

int main(void)
{
struct dati
{
char *nome;
char *cognome;
} ;
typedef struct dati datiImpiegato;

datiImpiegato *impiegato;
impiegato = (datiImpiegato *) malloc(sizeof(datiImpiegato));

impiegato->nome="Mario";
impiegato->cognome="Rossi";

return 0;
}

enoquick

unread,
May 5, 2013, 10:05:34 AM5/5/13
to
Il 05/05/2013 06:28, NERO23 ha scritto:
> Con il codice che ho riportato sotto (è solo un esempio...), nella
> memoria heap viene memorizzato solo l'indirizzo del nome mentre Mario è
> memorizzato nello stack?
>
> nero23
>
>
>
>
>
> #include <stdio.h>
>
> int main(void)
> {
> struct dati
> {
> char *nome;
> char *cognome;
> } ;
> typedef struct dati datiImpiegato;
>
> datiImpiegato *impiegato;
> impiegato = (datiImpiegato *) malloc(sizeof(datiImpiegato));
>
> impiegato->nome="Mario";
> impiegato->cognome="Rossi";
>
> return 0;
> }

Si la 1
No la 2, le costanti sono considerate variabili globali

Vincenzo Mercuri

unread,
May 5, 2013, 10:18:25 AM5/5/13
to
Il 05/05/2013 13:28, NERO23 ha scritto:
> Con il codice che ho riportato sotto (è solo un esempio...), nella
> memoria heap viene memorizzato solo l'indirizzo del nome mentre Mario è
> memorizzato nello stack?

Lo Standard C non parla di come e dove devono essere memorizzati i dati.
Inoltre "indirizzo del nome" è un termine improprio, perchè se il nome è
una "stringa" allora la risposta è no. Una "stringa" come side-effect
restituisce l'indirizzo del suo primo elemento, quindi l'indirizzo del
nome sarebbe l'indirizzo della variabile che contiene l'indirizzo del
suo primo elemento, cioè un puntatore a un puntatore. Semplicemente devi
dire che il puntatore "nome" conterrà l'indirizzo del primo elemento
dell'array di caratteri "Mario", ovvero &"Mario"[0]. E' molto probabile
che questo array di caratteri, in quanto `string literal', sia memorizzato
in un'area di memoria a sola lettura, diversa quindi dall'area di memoria
puntata dalla variabile `impiegato'.

> #include <stdio.h>

sicuramente intendevi <stdlib.h>

[..]

--
Vincenzo Mercuri

Manlio Perillo

unread,
May 5, 2013, 11:09:24 AM5/5/13
to
Il Sun, 05 May 2013 13:28:00 +0200, NERO23 ha scritto:

> Con il codice che ho riportato sotto (è solo un esempio...), nella
> memoria heap viene memorizzato solo l'indirizzo del nome

Viene allocata la memoria per la struttura contenente `nome` e `cognome`.

> mentre Mario è
> memorizzato nello stack?
>

La stringa "Mario" viene memorizzata in una area di memoria statica.
Inoltre se modifichi l'array allocato per tale stringa, ottieni un
undefined behaviour.

> [...]
>
> #include <stdio.h>
>

stdlib.h

> int main(void)
> {
> struct dati
> {
> char *nome;
> char *cognome;
> } ;
> typedef struct dati datiImpiegato;
>
> datiImpiegato *impiegato;
> impiegato = (datiImpiegato *) malloc(sizeof(datiImpiegato));
>
> impiegato->nome="Mario";
> impiegato->cognome="Rossi";
>

Se compili con -Wwrite-strings (usando GCC), ottieni un warning.
nome e cognome dovrebbero essere const char, altrimenti il tuo codice
potrebbe non funzionare con alcuni compilatori.

> return 0;
> }


Ciao Manlio
0 new messages