Repository 32bit  Forum
Repository 64bit  Wiki

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

[C] allocazione memoria in struttura

Messaggioda Toni » sab lug 12, 2008 21:28

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
Toni
Linux 2.6
Linux 2.6
 
Messaggi: 993
Iscritto il: lun gen 30, 2006 22:08
Località: milano
Slackware: slackware-14
Kernel: 3.10.5
Desktop: i3

Re: [C] allocazione memoria in struttura

Messaggioda phobos3576 » sab lug 12, 2008 21:46

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
phobos3576
Staff
Staff
 
Messaggi: 2980
Iscritto il: sab apr 16, 2005 23:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: [C] allocazione memoria in struttura

Messaggioda targzeta » sab lug 12, 2008 21:48

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
targzeta
Iper Master
Iper Master
 
Messaggi: 6147
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: [C] allocazione memoria in struttura

Messaggioda phobos3576 » sab lug 12, 2008 22:02

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 lug 12, 2008 22:37, modificato 1 volta in totale.
Avatar utente
phobos3576
Staff
Staff
 
Messaggi: 2980
Iscritto il: sab apr 16, 2005 23:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: [C] allocazione memoria in struttura

Messaggioda targzeta » sab lug 12, 2008 22:06

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
targzeta
Iper Master
Iper Master
 
Messaggi: 6147
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: [C] allocazione memoria in struttura

Messaggioda phobos3576 » sab lug 12, 2008 22:10

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[i], che è equivalente a *((a->m) + i)
Avatar utente
phobos3576
Staff
Staff
 
Messaggi: 2980
Iscritto il: sab apr 16, 2005 23:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: [C] allocazione memoria in struttura

Messaggioda targzeta » sab lug 12, 2008 22:15

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
targzeta
Iper Master
Iper Master
 
Messaggi: 6147
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: [C] allocazione memoria in struttura

Messaggioda phobos3576 » sab lug 12, 2008 22:34

In effetti, si potrebbe fare a meno del cast visto che ciò avviene implicitamente.
Avatar utente
phobos3576
Staff
Staff
 
Messaggi: 2980
Iscritto il: sab apr 16, 2005 23:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: [C] allocazione memoria in struttura

Messaggioda gioco » dom lug 13, 2008 1:59

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
gioco
Packager
Packager
 
Messaggi: 900
Iscritto il: sab giu 18, 2005 23:00
Località: in the court of the Wesnoth king
Slackware: last stable

Re: [C] allocazione memoria in struttura

Messaggioda Toni » dom lug 13, 2008 2:22

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 2.6
Linux 2.6
 
Messaggi: 993
Iscritto il: lun gen 30, 2006 22:08
Località: milano
Slackware: slackware-14
Kernel: 3.10.5
Desktop: i3

Re: [C] allocazione memoria in struttura

Messaggioda Toni » dom lug 13, 2008 2:35

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
Toni
Linux 2.6
Linux 2.6
 
Messaggi: 993
Iscritto il: lun gen 30, 2006 22:08
Località: milano
Slackware: slackware-14
Kernel: 3.10.5
Desktop: i3

Re: [C] allocazione memoria in struttura

Messaggioda phobos3576 » dom lug 13, 2008 14:19

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[i], *((a->m) + i) & C.

:lol: :lol: :lol: :lol:
Avatar utente
phobos3576
Staff
Staff
 
Messaggi: 2980
Iscritto il: sab apr 16, 2005 23:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: [C] allocazione memoria in struttura

Messaggioda Toni » dom lug 13, 2008 15:04

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

ancora grazie :thumbright:
Avatar utente
Toni
Linux 2.6
Linux 2.6
 
Messaggi: 993
Iscritto il: lun gen 30, 2006 22:08
Località: milano
Slackware: slackware-14
Kernel: 3.10.5
Desktop: i3


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite

cron