Pagina 1 di 1
[C] allocazione memoria in struttura
Inviato: sab 12 lug 2008, 22:28
da Toni
ciao a tutti
il problema è il seguente :
devo allocare dinamicamente una zona di memoria mxn
in codice:
Codice: Seleziona tutto
typedef struct
{
int **m;
int a;
int b;
} xxx;
void func(xxx *a,int r,int c){
int i;
a->a=r;
a->b=c;
a->m=malloc(sizeof(int *)*r);
for(i=0; i<=r; i++)
a->(*m+i)=(int *)malloc(sizeof(int)*c); /*errore*/
return ;
}
commetto un errore di sintassi , ma non riesco a capire il motivo ,
questa va a buon fine , quindi dovrebbe allocare spazio per un "vettore" di puntatori ad int , il problema si presenta quando voglio allocare spazio a ciascun puntatore:
errore ricevuto
grazie a tutti.
Re: [C] allocazione memoria in struttura
Inviato: sab 12 lug 2008, 22:46
da phobos3576
Se
a->m è l'indirizzo iniziale del vettore di puntatori a
int .... allora
*(a->m) è il primo elemento del vettore,
*(a->(m+1)) è il secondo elemento,
*(a->(m+2)) è il terzo elemento e così via.
... per cui ...
Codice: Seleziona tutto
for(i=0; i<=r; i++)
*(a->(m+i))=(int *)malloc(sizeof(int) * c);
Ho risposto di getto; spero di non aver scritto una boiata ...
Re: [C] allocazione memoria in struttura
Inviato: sab 12 lug 2008, 22:48
da targzeta
phobos3576 ha scritto:...Ho risposto di getto; spero di non aver scritto una boiata ...
Mi hai fregato, anche io stavo per dire la stessa cosa. Penso che l'errore sia proprio quello, ma volevo provare prima di postare
Spina
Re: [C] allocazione memoria in struttura
Inviato: sab 12 lug 2008, 23:02
da phobos3576
Infatti, ho risposto troppo velocemente; la sintassi corretta dovrebbe essere:
Codice: Seleziona tutto
for(i=0; i<=r; i++)
*((a->m) + i)=(int *)malloc(sizeof(int *) * c);
Re: [C] allocazione memoria in struttura
Inviato: sab 12 lug 2008, 23:06
da targzeta
In questi casi sarebbe meno fourviante usare la sintassi
anche perchè, in fin dei conti 'm' è un array. Poi mi spiegate del perchè di quel casting prima della malloc.
Spina
Re: [C] allocazione memoria in struttura
Inviato: sab 12 lug 2008, 23:10
da phobos3576
spina ha scritto:Poi mi spiegate del perchè di quel casting prima della malloc.
Spina
malloc restituisce
(void *), per cui il programmatore deve chiedere la conversione al tipo desiderato.
Comunque, funziona benissimo anche
a->m, che è equivalente a *((a->m) + i)
Re: [C] allocazione memoria in struttura
Inviato: sab 12 lug 2008, 23:15
da targzeta
phobos3576 ha scritto:...
malloc restituisce (void *), per cui il programmatore deve chiedere la conversione al tipo desiderato.
Mha, void è un tipo generico, quindi non bisogna chiedere niente

, basta che lo usi per come lo hai allocato, quel sizeof(int) basta IMHO. Tanto è vero che il compilatore non genera né warning, né error. Poi, se fosse così, perchè alla prima malloc non è stato usato nessun casting?
Forse è solo una diversa scuola di pensiero,
Spina
Re: [C] allocazione memoria in struttura
Inviato: sab 12 lug 2008, 23:34
da phobos3576
In effetti, si potrebbe fare a meno del cast visto che ciò avviene implicitamente.
Re: [C] allocazione memoria in struttura
Inviato: dom 13 lug 2008, 2:59
da gioco
Non ho avuto tempo di fare ricerche approfondite, comunque vi riporto il primo risultato trovato:
http://faq.cprogramming.com/cgi-bin/sma ... 1047673478
E' consigliato di non fare il cast perchè altrimenti si rischierebbe di avere un bug nel caso in cui il tipo del puntatore venisse modificato. Nel link c'è anche un consiglio su come usare sizeof (dereferenziando il puntatore piuttosto che applicando il sizeof al tipo di dato).
Re: [C] allocazione memoria in struttura
Inviato: dom 13 lug 2008, 3:22
da Toni
sono appena tornato dalla discoteca
ho lasciato la mia ragazza a casa in fretta e furia per vedere se qualcuno aveva risposto.
grazie a tutti problema risolto

Re: [C] allocazione memoria in struttura
Inviato: dom 13 lug 2008, 3:35
da Toni
a quanto pare non è necessario il casting
http://www.gnu.org/software/libc/manual ... Allocation
in particolare :
You can store the result of malloc into any pointer variable without a cast, because ISO C automatically converts the type void * to another type of pointer when necessary. But the cast is necessary in contexts other than assignment operators or if you might want your code to run in traditional C.
che differenza c'è tra C tradizionale, ansi C e ISO C?
EDIT:
trovata
http://www.gnu.org/software/libc/manual ... html#ISO-C
Re: [C] allocazione memoria in struttura
Inviato: dom 13 lug 2008, 15:19
da phobos3576
Re: [C] allocazione memoria in struttura
Inviato: dom 13 lug 2008, 16:04
da Toni