|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Bannato
Iscritto dal: Apr 2008
Città: Burgundi
Messaggi: 2179
|
[C] valore variabili globali
Scusate ma non riesco a trovare la soluzione a un quesito.
Con la dichiarazione di una variabile globale intera in C,senza inizializzazione, ha valore Zero? Ho provato con la stampa dei valori con la printf() è stampa sempre zero mentre stampando una variabile automatica mi da valori a caso. Dipende dal'implementazione o è una azione non definita dallo standard C89? int b; main(){ int x; static int k; printf("b==%d x==%d k==%d\n", b, x, k); } output sarà b==0 x==498880 k==0 mi sapete spiegare perché? Ultima modifica di grollagrolla123 : 09-06-2009 alle 16:47. |
|
|
|
|
|
#2 |
|
Junior Member
Iscritto dal: Jun 2009
Messaggi: 17
|
mmm da quel che ricordo se non la initializzi la variabile ha valore "casuale" (cioè quello che è presente in memoria allo stesso indirizzo).
Se quella globale viene automaticamente inzializzata a zero dipende dall'implementazione del compilatore. Ciao ------------------------------ Tetti Parma |
|
|
|
|
|
#3 |
|
Bannato
Iscritto dal: Apr 2008
Città: Burgundi
Messaggi: 2179
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
|
Non c'è un comportamento standard: alcuni compilatori oltre ad allocare spazio in memoria resettano anche il valore, altri allocano soltanto i byte necessari, quindi la variabile assume il valore contenuto in memoria in quel momento (casuale).
Per questo motivo, è OTTIMA abitudine inizializzare sempre una variabile prima di utilizzarla.
__________________
Il sole è giallo |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
confermo, anche a me risulta che il valore di una variabile non inizializzata sia arbitrario e non determinato dallo standard; per quanto riguarda esclusivamente le variabili globali quello che accade su Windows é che il compilatore le mette in una sezione dati non inizializzati che ha raw size nulla e virtual size non nulla, e quando il modulo eseguibile viene caricato in memoria il Virtual Memory Manager di Windows inizializza di default tutte le pagine allocate per tali sezioni riempiendole di zeri; quindi su Windows le variabili globali non inizializzate dovrebbero essere sempre nulle, ma si tratta di un comportamento assolutamente non portabile.
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
C99 standard 6.7.8.10:
If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate. If an object that has static storage duration is not initialized explicitly, then: — if it has pointer type, it is initialized to a null pointer; — if it has arithmetic type, it is initialized to (positive or unsigned) zero; — if it is an aggregate, every member is initialized (recursively) according to these rules; — if it is a union, the first named member is initialized (recursively) according to these rules. |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
|
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
Quote:
If the declaration of an identifier for a function has no storage-class specifier, its linkage is determined exactly as if it were declared with the storage-class specifier extern. If the declaration of an identifier for an object has file scope and no storage-class specifier, its linkage is external. 6.2.4.3 An object whose identifier is declared with external or internal linkage, or with the storage-class specifier static has static storage duration. Its lifetime is the entire execution of the program and its stored value is initialized only once, prior to program startup. 6.7.8.10 If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate. If an object that has static storage duration is not initialized explicitly, then: — if it has pointer type, it is initialized to a null pointer; — if it has arithmetic type, it is initialized to (positive or unsigned) zero; — if it is an aggregate, every member is initialized (recursively) according to these rules; — if it is a union, the first named member is initialized (recursively) according to these rules, |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2781
|
C'è da dire però che lo standard C99 non è seguito da tutti i compilatori e a volte non è implementato completamente.
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
Quote:
(in realtà anche il GCC non lo ha implementato completamente, ma mi sembra che siano ad un altro livello)Comunque probabilmente quei punti ci sono anche negli standard precedenti... solo che non ho trovato pdf consultabili gratuitamente.
Ultima modifica di ||ElChE||88 : 10-06-2009 alle 08:47. |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Roma
Messaggi: 806
|
In linea generale credo che dipenda dall'implementazione del compilatore.
Personalmente cerco di attenermi alle buone regole di programmazione che impongono SEMPRE E COMUNQUE di inizializzare una variabile prima di utilizzarla, a meno che essa non venga assegnata successivamente prima dell'utilizzo. In altri termini, non dare nulla per scontato sul comportamento del compilatore, anche perché se poi il codice deve essere "portato" su un altro compilatore e/o sistema operativo non è detto che si comporti nello stesso modo. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:12.












(








