значение указателя печати NULL - PullRequest
0 голосов
/ 15 марта 2019

почему я не могу напечатать указатель со значением NULL? Это мой код:

#include <stdio.h>
int main(void)
{
    int * p = 0;

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

    getchar();
    return 0;
}

Ошибка: «Возникло исключение: нарушение прав чтения. р был nullptr. " Я хочу понять ошибку ...

Ответы [ 2 ]

4 голосов
/ 15 марта 2019

p равно NULL, что является недопустимым значением указателя - по этому адресу нет объектов. Выражение *p в вызове printf пытается разыменовать этот недопустимый указатель, и при этом поведение undefined . В этом конкретном случае это приводит к сбою вашего кода.

Помните, что декларация

int * p = 0;

создает объект типа «указатель на int» (* только для обозначения типа) и инициализирует значение этого объекта указателя 0 (NULL). По определению , p не указывает ни на какой объект или функцию, поэтому выражение *p не имеет смысла.

Не говоря уже о том, что выражение *p имеет тип int, поэтому для его печати вы должны использовать %d, а не %p.

Примечание - есть нулевой указатель константа и нулевой указатель значение . Константа с нулевым значением в контексте указателя (например, 0 или (void*) 0) является нулевым указателем constant (макрос NULL). Во время перевода этот нулевой указатель константа преобразуется в нулевой указатель значение , которое может быть или не быть 0. Значение нулевого указателя - это просто какое-то четко определенное значение адреса, которое гарантированно будет отличаться от адреса любого объекта или функции.

0 голосов
/ 15 марта 2019

Указатели указывают на переменную. Попробуйте с этим:

#include <stdio.h>
int main(void)
{

    int a = 0;
    int * p = &a;

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

    getchar();
    return 0;
}
...