Печать произвольного адреса неинициализированного указателя на указатель - PullRequest
0 голосов
/ 11 июля 2020

Я обнаружил, что для вывода произвольного адреса неинициализированного указателя код:

#include <stdlib.h>
#include <stdio.h>

int main()
{
int x = 1;
int *pi0;
int *pi = NULL;
int *pi2 = &x;
int *pi3;
int **ppi;

    printf("Indirizzo pi0: \t %p\n", pi0);      // 0x55e43192a080
    printf("Indirizzo pi: \t %p\n", pi);        // (nil)
    printf("Indirizzo x: \t %p\n", &x);         // 0x7ffdb8405f44
    printf("Indirizzo pi2: \t %p\n", pi2);      // 0x7ffdb8405f44
    printf("Indirizzo pi3: \t %p\n", pi3);      // 0x7ffe56ffe6b0
    printf("Indirizzo pi3: \t %p\n", ppi);      // ???
    
    return 0;
}

Моя цель - сделать то же самое с не инициализирован указатель на указатель, но, как вы можете видеть в последнем printf, если я попытаюсь распечатать адрес ppi, ничего не произойдет (без предупреждения, без ошибки, без вывода).

РЕДАКТИРОВАТЬ: код работает, я сделал ошибку в последнем printf, потому что написал pi3 вместо ppi.

1 Ответ

0 голосов
/ 11 июля 2020

В основном все, что здесь происходит, зависит от базовой реализации вашей системы. Вы вызываете неопределенное поведение, обращаясь к значению неинициализированной переменной (в данном случае указателя, который представляет собой переменную, которая содержит адрес виртуальной памяти).

Если ваша система не замечает или не заботится он, вероятно, просто распечатает значение регистра, который компилятор использует для ppi, который, вероятно, равен 0x0 (nil) или, возможно, совершенно произвольному значению.

Неопределенное поведение не означает, что будет ошибка сообщение или программа выдаст sh или что-нибудь вообще, это просто означает, что язык программирования C не гарантирует какого-либо специфического поведения c, поэтому все, что компилятор решит сделать, полностью допустимо. Это - хорошее прочтение, если вы хотите узнать больше

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