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 ,

Codice: Seleziona tutto

 a->m=malloc(sizeof(int *)*r);   
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:

Codice: Seleziona tutto

a->(*m+i)=(int *)malloc(sizeof(int)*c); 
errore ricevuto

Codice: Seleziona tutto

error: expected identifier before '(' token
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 :D

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

Codice: Seleziona tutto

for(i=0; i<=r; i++)
    a->m[i]=malloc(sizeof(int)*c);
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 :D :D
ho lasciato la mia ragazza a casa in fretta e furia per vedere se qualcuno aveva risposto.

grazie a tutti problema risolto :thumbright:

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
Toni ha scritto:sono appena tornato dalla discoteca :D :D
ho lasciato la mia ragazza a casa in fretta e furia per vedere se qualcuno aveva risposto.
Ah, bene, bene, tu in discoteca a divertirti con la tua ragazza e noi qui a fonderci il cervello con (void *), (int **), a->m, *((a->m) + i) & C.

:lol: :lol: :lol: :lol:

Re: [C] allocazione memoria in struttura

Inviato: dom 13 lug 2008, 16:04
da Toni
infatti gli amici si vedono nel momento del bisogno :lol: :lol: :lol: :lol:

ancora grazie :thumbright: