почему я получаю ошибку сегментации при приведении пустого указателя к целочисленному указателю - PullRequest
0 голосов
/ 23 января 2020
using namespace std;
void* fun(int);
int main()
{
     int i;
     cin>>i;
     int *t = (int *)fun(i);
     if(!t)
         cout<<"null value\n";
     else cout<<*t<<"\n";
     return 0;
}
void* fun(int i)
{
     if(i==0)
         return NULL;
     else return (void *)i;
}

Получение ошибки сегментации на линии cout << * t << "\ n"; (при разыменовании) для всех значений, кроме 0 </p>

Заранее спасибо !!

Ответы [ 2 ]

3 голосов
/ 23 января 2020

void * fun (int i)

Это не то же самое i от основного, скорее его копия из другого места исключительно в рамках этой функции fun. Использование его вне области действия функции через ее адрес приведет к неопределенному поведению. Таким образом, вместо передачи по ссылке, и она будет принимать те же i от основного

void* fun(int &i)

Второе - приведение целого числа к void *. Это преобразование целого числа в адрес местоположения и разыменование его снова вызывает UB.

return (void *)&i;

Вернет адрес, который можно привести обратно к int *.

3 голосов
/ 23 января 2020

С

return (void *)i;

вы возвращаете значение из i в качестве указателя, но это значение не является указателем само по себе, и поэтому оно не может быть разыменовано.

Вы должны просто привести его к правильному типу и распечатать как есть:

cout << reinterpret_cast<intptr_t>(t) << '\n';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...