[C] allocazione memoria in struttura

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
Toni
Linux 3.x
Linux 3.x
Messaggi: 998
Iscritto il: lun 30 gen 2006, 22:08
Slackware: slackware-14
Kernel: 3.10.5
Desktop: i3
Località: milano

[C] allocazione memoria in struttura

Messaggio 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.

Avatar utente
phobos3576
Staff
Staff
Messaggi: 2980
Iscritto il: dom 17 apr 2005, 0:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: [C] allocazione memoria in struttura

Messaggio 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 ...

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6545
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [C] allocazione memoria in struttura

Messaggio 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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà 

Avatar utente
phobos3576
Staff
Staff
Messaggi: 2980
Iscritto il: dom 17 apr 2005, 0:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: [C] allocazione memoria in struttura

Messaggio 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);
Ultima modifica di phobos3576 il sab 12 lug 2008, 23:37, modificato 1 volta in totale.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6545
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [C] allocazione memoria in struttura

Messaggio 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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà 

Avatar utente
phobos3576
Staff
Staff
Messaggi: 2980
Iscritto il: dom 17 apr 2005, 0:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: [C] allocazione memoria in struttura

Messaggio 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)

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6545
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [C] allocazione memoria in struttura

Messaggio 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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà 

Avatar utente
phobos3576
Staff
Staff
Messaggi: 2980
Iscritto il: dom 17 apr 2005, 0:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: [C] allocazione memoria in struttura

Messaggio da phobos3576 »

In effetti, si potrebbe fare a meno del cast visto che ciò avviene implicitamente.

Avatar utente
gioco
Packager
Packager
Messaggi: 900
Iscritto il: dom 19 giu 2005, 0:00
Slackware: last stable
Località: in the court of the Wesnoth king
Contatta:

Re: [C] allocazione memoria in struttura

Messaggio 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).

Avatar utente
Toni
Linux 3.x
Linux 3.x
Messaggi: 998
Iscritto il: lun 30 gen 2006, 22:08
Slackware: slackware-14
Kernel: 3.10.5
Desktop: i3
Località: milano

Re: [C] allocazione memoria in struttura

Messaggio 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:

Avatar utente
Toni
Linux 3.x
Linux 3.x
Messaggi: 998
Iscritto il: lun 30 gen 2006, 22:08
Slackware: slackware-14
Kernel: 3.10.5
Desktop: i3
Località: milano

Re: [C] allocazione memoria in struttura

Messaggio 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

Avatar utente
phobos3576
Staff
Staff
Messaggi: 2980
Iscritto il: dom 17 apr 2005, 0:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: [C] allocazione memoria in struttura

Messaggio 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:

Avatar utente
Toni
Linux 3.x
Linux 3.x
Messaggi: 998
Iscritto il: lun 30 gen 2006, 22:08
Slackware: slackware-14
Kernel: 3.10.5
Desktop: i3
Località: milano

Re: [C] allocazione memoria in struttura

Messaggio da Toni »

infatti gli amici si vedono nel momento del bisogno :lol: :lol: :lol: :lol:

ancora grazie :thumbright:

Rispondi