|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
C/C++ e strutture
era da un pochetto che non scrivevo programmi in C ed oggi mi è capitato di usare alcune funzioni che necessitano di alcune grosse strutture per funzionare; strutture che vengono popolate dopo aver chiamato la funzione stessa.
All'inizio dopo il lancio del programma veniva sollevata una eccezzione alchè mi sono ricordato che di solito le strutture vanno mallocate, passatemi il termine, in memoria però domando: perchè ve ne sono alcune che senza allocare spazio eseguono correttamente il loro compito ? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
|
Per le strutture, come per qualsiasi tipo di dato in c, hai bisogno di allocare memoria solo quando fai allocazione dinamica, ergo usi i puntatori. Nel caso dichiari una variabile statica, di tipo struttura, l'allocazione di memoria viene fatta automaticamente.
Ti riporto un banale esempio che illustra la definizione di una struttura e la dichiarazione di una variabile di tipo struttura e di un puntatore alla struttura, che vanno gestiti in maniera differente Codice:
int main()
{
typedef struct
{
int a;
int b;
} my_struct;
my_struct x; // variabile di tipo my_struct
my_struct* y; // puntatore a my_struct
x.a=8; //corretta (non ho allocato nulla)
y=(my_struct*)malloc(sizeof(my_struct)); //se ometti questa allocazione, l'istruzione seguente va in errore
y->a=9;
}
__________________
Il sole è giallo |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
la confusione è nata usando una funzione di questo tipo:
FW short WINAPI SpecFunctDir(unsigned short LibHndl, short type, short *top_prog, short *num_prog, PRGDIR *buf); Codice:
unsigned short LibHndl; short type = 0; short top_prog; short num_prog; PRGDIR buf; SpecFunctDir(LibHndl, type, &top_prog, &num_prog, &buf); in questo modo invece...... Codice:
unsigned short LibHndl; short type = 0; short *top_prog; short *num_prog; PRGDIR *buf; SpecFunctDir(LibHndl, type, top_prog, num_prog, buf); |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Alla SpecFunctDir() interessa ricevere un puntatore ad una struttura PRGDIR, presumo per scriverci dei dati da "restituire". Che tu passi l'indirizzo di una PRGDIR allocata sullo stack (variabile automatica, come nel tuo primo esempio) o passi un puntatore a PRGDIR, allocato da qualche parte magari dinamicamente, alla SpecFunctDir() importa poco o nulla. Dove allocare la struttura, dipende da diversi fattori: la dimensione della struttura, cosa devi farci, ecc...
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
PRGDIR è una struttura e se non ricordo male scrivendo PRGDIR buf; // il compilatore alloca spazio automatcamente per la struttura PRGDIR *buf; // il compilatore non alloca spazio e devo pensarci io |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
una conferma di quanto sopra ?
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
E' corretto perchè è come se dichiarassi un puntatore, e poi non lo fai puntare a nulla.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:39.




















