2016-11-14 3 views
-2
//line 2 causes the program to terminate 
#include <stdio.h> 
int main() 
{ 
int *qi = 0; //1 -- making qi a null pointer 
if(qi==NULL) printf("Null\n"); 
else printf("Not Null\n"); 
*qi =0; // 2 --- assigning *qi a decimal zero value. 
return 0; 
} 

Kommentar Nummer 2 in dem obigen Code während das Programm beendetZuweisen dezimale Null auf einen C-Zeiger

qi = &zero; 

in dem obigen Code eine Zeile hinzufügen, bevor Kommentar Nummer 2 Dieses unterhalb

wie gezeigt, verhindert
// this code works fine 
#include <stdio.h> 
int main() 
{ 
int *qi = 0; //1 
if(qi==NULL) printf("Null\n"); 
else printf("Not Null\n"); 
int zero =0; 
qi = &zero; 
*qi= zero; //2 
printf("%d\n",*qi); 
return 0; 
} 

warum passiert das? Erklären Sie, als würden Sie einem Kind erklären.

+3

Ohne richtig einen Block von 'sizeof int' Bytes an der Speicheradresse 0, die Anweisung' * qi = 0 '(vorane Zuteilung von ' qi = 0') ergibt undefiniertes Verhalten. Und mit 'qi = & zero' setzen Sie' qi', um auf einen richtig zugewiesenen Block von 'sizeof int' Bytes zu zeigen, was Ihnen erlaubt,' * qi = 0' sicher auszuführen. –

+0

@barakmanos Danke :) – zerobyzero

+0

Gern geschehen :) –

Antwort

1

es ist einfach ... ein ganzzahliger Zeiger zeigt auf den Speicherblock, der von einer Ganzzahl zugewiesen wird. Ein Nullzeiger hat keinen Speicher zum Zeigen. also mit * qi = 0; Sie definieren einen Null-Standort, der eigentlich nicht existiert. Und in Ihrem zweiten Fall zeigen Sie Ihren ganzzahligen Zeiger auf eine ganzzahlige Variable Null, so dass das funktioniert.

+0

Typen vergeben nichts. Und in C ist es nicht das Objekt, das den Zugriffstyp definiert, sondern den Typ, der für den Zugriff verwendet wird (ein anderer Typ verwendet in vielen Situationen undefiniertes Verhalten). – Olaf

1
int *qi = 0; 

qi ist ein Nullzeiger. Sie können nicht viel mit einem Nullzeiger machen. Insbesondere dürfen Sie nicht dereferenzieren, es zu lesen oder schreiben:

*qi = 0; // WRONG - illegal use of a null pointer. 

Jetzt führen wir

qi = &zero; 

qi ist nicht länger ein Null-Zeiger, wie wir die Adresse von zero darin gespeichert. qiPunkte zuzero.

*qi = zero; // RIGHT (but pointless) 

Dies kopiert die in zero an den Ort gespeicherten Wert, auf den qi. Wir wissen, dass qi Punkte zero, so ist dies jetzt die gleiche wie

Schreiben
zero = zero;