看到这个帖子,我写了以下内容:How do I convert from void * back to 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;
}
输出:
anisha@linux-dopx:~/> ./a.out 323
value:
323
Segmentation fault
anisha@linux-dopx:~/>
GCC
我错过了什么意思?
答案 0 :(得分:3)
忽略中间转化的潜在问题,您从int
开始,最后将其视为int*
。换句话说,您将atoi()
的结果视为地址,并尝试读取该地址的内存。
答案 1 :(得分:3)
好的,请忽略我之前的回答。请执行以下操作,而不是(char*)port - (char*)0
:
int h = *(int *)(&port);
您的地址为port
:
&port
将地址转换为int *
:
(int *)(&port)
然后解除引用地址以获取放入port
的整数值:
*(int *)(&port)
答案 2 :(得分:1)
我根据this SO answer进行了以下调整:
#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
答案 3 :(得分:0)
您尝试将port
强制转换为int指针,但它不是指针。这是一个价值。您正在使用323
作为指针。如果您想获得int *
,则可以使用类型转换argv[1]
或指向port
的指针。端口也可能不会被声明为void *
,因为它被处理为atoi()
中的int,它应该只是int
。
答案 4 :(得分:0)
您正在取消引用指向您不拥有的内存的指针,这是未定义的行为。
答案 5 :(得分:0)
更改以下行
void* port = (void*) atoi (argv[1]);
到
int port = atoi (argv[1]);
答案 6 :(得分:0)
使用此
int h =((int)port);
因为您将 int 转换为 void *
现在按((int )port)
因此请使用int h = ((int )port);