2016-11-14 9 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; 
} 

комментарий № 2 в приведенной выше коде завершает программу, тогда как при добавлении одной строкиНазначения десятичного нуля на указатель C

qi = &zero; 

в коде выше, перед тем комментарием № 2 предотвращает это, как показано ниже

// 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; 
} 

Почему это происходит? Объясните, как будто вы объясняете ребенку.

+3

Без правильно выделения блока 'SizeOf int' байтов в адрес памяти 0, оператор' * ци = 0 '(предшествуют ' qi = 0') дает неопределенное поведение. И с 'qi = & zero', вы устанавливаете' qi' для указания на правильно выделенный блок байтов sizeof int', который позволяет вам безопасно выполнять '* qi = 0'. –

+0

@barakmanos Спасибо :) – zerobyzero

+0

Добро пожаловать :) –

ответ

1

это просто ... указатель целых чисел указывает на блок памяти, выделенный целым числом. Нулевой указатель не имеет точки памяти. так что * qi = 0; вы переопределяете нулевое местоположение, которого на самом деле не существует. А во втором случае вы указываете свой целочисленный указатель на целочисленную переменную нуль, чтобы это работало.

+0

Типы ничего не выделяют. И в C это не тот объект, который определяет тип доступа, но тип, используемый для доступа к нему (с использованием другого типа вызывает неопределенное поведение во многих ситуациях). – Olaf

1
int *qi = 0; 

qi - это нулевая указатель. Вы не можете много сделать с нулевым указателем. В частности, вы не должны разыменования его читать и писать:

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

Теперь мы выполнить

qi = &zero; 

qi больше не является нулевым указателем, как хранится адрес zero в нем. qiуказывает наzero.

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

Это копирует значение хранится в zero в месте, на который указывает qi. Мы знаем, что qi указывает на zero, так что это теперь такой же, как написание

zero = zero;