2015-04-09 4 views
1

1.различные способы инициализации указателя в C

int *a; 
*a=5; 
printf("%d",*a); 

Почему это один не дает никаких выходных данных, конец с возвращением большое значение?

2.

int *a,b=1; 
a=&b; 
*a=5; 
printf("%d",*a); 

Почему это работает хорошо и показывает выход как 5?

+2

«* различные способы инициализации указателя *»: случай 1 не ** ** инициализирует указатель 'a', тогда как в случае 2:' a = & b'. – alk

ответ

1

В первом фрагменте указатель a не инициализирован, а инструкция *a = 5; пишет 5 в нераспределенном месте. Если местоположение, измененное этим утверждением, принадлежит программе, то оно может вести себя беспорядочно. Если он относится к операционной системе, программа, скорее всего, потерпит крах. Поведение не определено.

3

В первом фрагменте кода

int *a; 

a является указателем и не указывает на какой-либо уважительной ячейку памяти, и вы разыменования указателя, который приведет к непредсказуемому поведению.

Второй фрагмент кода является хорошим и действительным У вас есть указатель на переменную b и на ней есть.

a = &b; 
*a = 5; 

Теперь указатель указывает на адрес переменной b и изменить содержимое в том месте, которое определяется

0

a является int*, указатель на int. В первом фрагменте кода, где вы думаете, a указывает на? Ответ на этот вопрос: a указывает на случайный местоположение. Используя

*a=5; 

Вы разыскиваете указатель и записываете 5 в неправильное расположение памяти. Это вызывает Undefined Behavior, и все может случиться. Если вам повезет, у вас может возникнуть ошибка Segmentation Fault.

Во втором фрагменте кода b представляет собой целочисленную переменную int. Память для него предоставляется ОС в стеке. Вы делаете a указателем на адрес переменной b. Затем разыменование указателя и запись 5 в это место является действительным, поскольку память выделяется для переменной b.

Смежные вопросы