2011-08-30 2 views
9

sguardo,valore predefinito del puntatore.?

typedef struct jig 
    { 
     int *a; 
     int *b; 
    }temp; 

ora fase 1:

temp *b; 
b= (temp*)malloc(sizeof(temp)); 

if(b->a != NULL) 
    printf("a is not null\n"); 
else 
    printf("a is null\n"); 
if(b->b != NULL) 
    printf("b is not null\n"); 
else 
    printf("b is null\n"); 

output è:

a is null 
b is null 

ora fase 2:

temp b; 

if(b.a != NULL) 
    printf("a is not null\n"); 
else 
    printf("a is null\n"); 
if(b.b != NULL) 
    printf("b is not null\n"); 
else 
    printf("b is null\n"); 

output è:

a is not null 
b is not null 

perché questo sta accadendo?

+0

Sono stati visualizzati avvisi del compilatore che segnalavano variabili non inizializzate? –

+0

utilizzando -wall non mostra alcun avviso ... !!! –

+1

Non fare affidamento sui risultati relativi all'implementazione. – Stan

risposta

32

I puntatori non hanno valore predefinito. Il valore che hanno è proprio quello che spazzatura era nella memoria che stanno usando ora. A volte un compilatore specifico azzererà la memoria, ma non è standard, quindi non contare su di esso.)

La memoria da malloc che è NULL era una coincidenza; avrebbe potuto essere qualsiasi altro valore altrettanto facilmente. È necessario e dovrebbe sempre impostare manualmente tutti i puntatori su NULL.

Un'altra alternativa è che puoi anche usare calloc, che fa la stessa cosa di malloc ma imposta tutti i bit a 0 nel blocco di memoria che ti dà. Ciò non aiuta tuttavia con le variabili di stack, quindi è necessario impostarli su NULL da soli.

+0

nella gestione della memoria di tutto il sistema integrato funzionerà con calloc .. ?? –

+1

@ Mr.32 è una funzione C standard se è questo che intendi. –

3

Caso, ecco cosa sta succedendo. Nessuno dice che la memoria non inizializzata e non statica debba avere un valore. Entrambi potrebbero contenere qualsiasi cosa.

  • Nel primo caso è semplicemente accaduto che malloc restituito la memoria da una pagina cancellata (in modo che contenga 0)
  • Nel secondo caso c'era roba sullo stack in modo che la memoria contiene spazzatura
+0

ma nello stage 2 è sempre NULL .... l'ho visto molte volte .. –

+0

@ Mr.32 Solo se 'b' ha memoria statica. – cnicutar

+0

ho appena dichiarato come temp b; –

7

Questo dipende completamente dal sistema operativo, non si sa dove saranno puntati i puntatori, in tal caso, poiché non è specificato. Dovresti sempre impostare i tuoi puntatori su NULL, non importa cosa.

2

In entrambi i casi i contenuti di temp saranno dati non inizializzati (casuali). Possono essere nulli o non nulli. Indipendentemente dal modo in cui ottieni gli stessi valori, non fare affidamento su questo, a meno che la documentazione specifichi in modo specifico ciò che devono essere.