Pagina 2 di 2

Re: Nuovo forum programmazione

Inviato: dom gen 06, 2008 21:07
da boh
Grazie Blizzard per il chiarimento :D

Re: Nuovo forum programmazione

Inviato: dom gen 06, 2008 21:24
da Blizzard
Mondai arimasen! :hello2:

Re: Nuovo forum programmazione

Inviato: lun gen 07, 2008 2:43
da Dani
Blizzard ha scritto:Se poi sei bravo e scrivi int *p=NULL; allora hai il 100%(percentuale vera =D> ) delle possibilità di far esplodere il programma.

Io ho sempre letto che è buona norma inizializzare i puntatori a null :lol: A chi devo credere ? .

Re: Nuovo forum programmazione

Inviato: lun gen 07, 2008 10:20
da Paoletta
Dani ha scritto:
Blizzard ha scritto:Se poi sei bravo e scrivi int *p=NULL; allora hai il 100%(percentuale vera =D> ) delle possibilità di far esplodere il programma.

Io ho sempre letto che è buona norma inizializzare i puntatori a null :lol: A chi devo credere ? .


immagino che blizzard intenda dire che ti imbatti in un segfault nel momento in cui accedi all'elemento puntato

Re: Nuovo forum programmazione

Inviato: lun gen 07, 2008 10:28
da Blizzard
ciao,
@paoletta: esatto!

@dani:
infatti ho scritto "se sei bravo" :D
è fondamentale inizializzare i puntatori a NULL, come le variabili ad un valore di default.
Se questi/queste(le variabili) non sono globali, al loro interno contengono il valore della locazione di memoria cui fanno riferimento :P
In pratica quando all'interno del main fai int a; a non è a 0 ma al valore che i 4byte che interessano ad a contenevano prima della dichiarazione della variabile.
Per i puntatori è uguale. Se da un lato hai svariate possibilità che questi valori siano insignificanti e che quindi possano portare anche ad una segfault... dall'altro può capitare che il valore sia davvero l'indirizzo di una variabile... e che a questo punto cominci a variare cose che neanche tu hai l'idea.

Ti faccio un rapido esempio sfruttando questa caratteristica

Codice: Seleziona tutto

#include <stdio.h>

void Test()
{
   int a;
   
   if(a!=1)
   {
      printf("ora a ha un valore indefinito: %d\n",a);
      a=1;
      printf("ora l'ho settato ad 1 ed esco dalla procedura\n\n");
      return;
   }
   else
   {
      printf("Vedi che ha conservato il suo valore????\n");
   }
}

int main()
{
   Test();
   Test();
   return 1;
}

Se lanci questo codice vedrai che non essendoci giochi di memoria (altre dichiarazioni o che ne so) tra le due chiamate di Test, a viene dichiarata nella stessa area di memoria... e quindi contiene il valore che aveva prima di terminare il suo ciclo di vita nella funzione!
Non è una cosa piuttosto pericolosa?????
(La risposta è si! perchè ci sono passato... proprio con i puntatori... vattelo a pesca un errore del genere #-o )
Quindi che siano puntatori o variabili normali.... dichiarare+inizializzare!
Penso i costruttori di default siano nati "anche" in virtù di questo aspetto

ciao
Gio

Re: Nuovo forum programmazione

Inviato: lun gen 07, 2008 12:01
da Dani
Ah ok avevo inteso male il "se sei bravo", come un "se non capisci nulla e di conseguenza inizializzi le variabili automatiche a null..." .