对类型转换的分段错误指向int的void指针

时间:2012-01-11 08:06:44

标签: c++ segmentation-fault void void-pointers

看到这个帖子,我写了以下内容: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

我错过了什么意思?

7 个答案:

答案 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)

void * 转换回 int

因此请使用int h = ((int )port);