Почему я получаю ошибку при попытке напечатать нулевой указатель - PullRequest
3 голосов
/ 12 марта 2019
#include <stdio.h>
void main ()
{
    int* p = NULL;
    printf("%d", *p);
}

Он печатает:

Exception thrown: read access violation.
p was nullptr.

Ответы [ 2 ]

7 голосов
/ 12 марта 2019

NULL указатели не могут быть разыменованы.

Это вызывает неопределенное поведение , что в данном случае проявляется в аварийном завершении вашей программы.

Это описано в разделе 6.5.3.2p4 стандарта C:

4 Унарный оператор * обозначает косвенность.Если операнд указывает на функцию, результатом является обозначение функции;если он указывает на объект, результатом является lvalue, обозначающее объект.Если операнд имеет тип «указатель на тип», результат имеет тип «тип». Если указателю присвоено недопустимое значение, поведение унарного оператора * не определено. 102)

102) Таким образом, &*E эквивалентно E (даже если E является нулевым указателем) и &(E1[E2])до ((E1)+(E2)).Всегда верно, что если E является обозначением функции или lvalue, который является допустимым операндом унарного оператора &, *&E является обозначением функции или lvalue, равным E.Если *P - это lvalue, а T - это имя типа указателя объекта, *(T)P - это lvalue, тип которого совместим с типом, на который указывает T.

Среди недопустимых значений для разыменования указателя унарным оператором * есть нулевой указатель , адрес, неправильно выровненный для типа объекта, на который указывает объект, и адрес объектапосле окончания срока его службы.

Если вы хотите напечатать сам указатель, передайте его в printf без разыменования и используйте спецификатор формата %p:

printf("%p\n", (void *)p);
3 голосов
/ 12 марта 2019

Поведение int* p = NULL; *p; равно undefined .

Если вы хотите распечатать адрес из p, тогда используйте "%p" в качествеспецификатор формата и отбросьте разыменование:

printf("%p", (void*)p);

Приведение к (void*) требуется для точного соответствия спецификатору формата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...