Ошибка сегментации при приведении типа к пустому указателю на int - PullRequest
1 голос
/ 11 января 2012

Просматривая эту ветку, я написал следующее: Как конвертировать из void * обратно в int

#include <iostream>
#include <stdlib.h>
using namespace std;

int main (int argc, char *argv[])
{
    void* port = (void*) atoi (argv[1]);

    cout << "\nvalue: \n" << atoi (argv[1]) << "\n";

    int h = *((int *)port);
    cout << h;
}

output:

anisha@linux-dopx:~/> ./a.out 323

value: 
323
Segmentation fault
anisha@linux-dopx:~/>

GCC

Какой смысл мне не хватать?

Ответы [ 7 ]

3 голосов
/ 11 января 2012

Хорошо, пожалуйста, проигнорируйте мой предыдущий ответ. Вместо (char*)port - (char*)0, пожалуйста, сделайте следующее:

int h = *(int *)(&port);

Вы получаете адрес port:

&port

Приведение адреса к int *:

(int *)(&port)

Затем разыменуем адрес, чтобы получить целочисленное значение, которое вы положили в port:

*(int *)(&port)
3 голосов
/ 11 января 2012

Игнорируя потенциальные проблемы с промежуточными конверсиями, вы начинаете с int и в конечном итоге рассматриваете его как int*.Другими словами, вы обрабатываете результат atoi() как адрес и пытаетесь прочитать память по этому адресу.

1 голос
/ 11 января 2012

Я сделал следующую корректировку, основываясь на этом SO-ответе :

#include <iostream>
#include <stdlib.h>
using namespace std;

int main (int argc, char *argv[])
{
    void *port = (void *) atoi(argv[1]);

    cout << "\nvalue: \n" << atoi (argv[1]) << "\n";

    int h = (char*)port - (char*)0;    
    cout << h;
}

Результат:

$ g++ -Wall test.cpp
$ ./a.out 323

value: 
323
323
0 голосов
/ 05 сентября 2014

используйте это

int h = ((int) port);

Поскольку вы конвертировали int в void *

Теперь конвертируйте обратно void * в int на ((int )port)

Так что используйте int h = ((int )port);

0 голосов
/ 11 января 2012

Изменить ниже строки

void* port = (void*) atoi (argv[1]); 

до

int port = atoi (argv[1]); 
0 голосов
/ 11 января 2012

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

0 голосов
/ 11 января 2012

Вы пытаетесь ввести port к указателю на int, но это не указатель. Это ценность. Вы используете 323 в качестве указателя. Если вы хотите получить int *, введите либо typepec argv[1], либо указатель на port. Порт также, вероятно, не должен быть объявлен как void *, поскольку он обрабатывается в int в atoi(), вероятно, он должен быть просто int.

...