将int转换为void *

时间:2014-10-14 18:56:05

标签: c pointers gcc

我试图从int创建一个void *。但是gcc总是给我一个警告,我不能把int转换为void *。这是我的代码:

#define M_TABLE_SIZE 64*1024
static const void* M_OFFSET = M_TABLE_SIZE;

我已经尝试(void*)M_TABLE_SIZE,但后来收到错误,我无法使用*运算符。

将int转换为void *的正确方法是什么?

3 个答案:

答案 0 :(得分:5)

这个

static const void* M_OFFSET = (void*)M_TABLE_SIZE;

扩展为

static const void* M_OFFSET = (void*)64*1024;

由于gcc编译您正在void*和int(1024)之间执行算术运算。将您的定义放在括号内:

#define M_TABLE_SIZE (64*1024)

现在,你可以这样做:

static const void* M_OFFSET = (void*) M_TABLE_SIZE;

没有问题。将#define置于括号中以避免出现这种意外情况始终是一种好习惯。

除非您拥有该值的有效地址,否则在尝试使用该指针时,您将调用未定义的行为。所以一定要明白你在做什么!

答案 1 :(得分:0)

首先,您使用的是define,它不是变量。 预处理器将替换您的代码:

static const void* M_OFFSET = 64*1024;

这不太可能是你要做的。

您可以声明一个const int变量并将其引用转换为void *。

答案 2 :(得分:0)

对于一个相当新的编译器(支持C99),您不应将地址存储或表示为普通int值。如果您真的需要这样的技巧,那么请考虑一种专用类型,即intptr_tuintptr_t。参考N1570 7.20.1.4/p1(能够保存对象指针的整数类型):

  

以下类型指定带有属性的带符号整数类型   那么任何有效的void指针都可以转换为这种类型   转换回指向void的指针,结果将相等   到原始指针:

     

intptr_t

     

以下类型指定带有的无符号整数类型   可以将任何有效指向void的指针转换为此类型的属性,   然后转换回指向void的指针,结果将进行比较   等于原始指针:

     

uintptr_t

     

这些类型是可选的。

在你的情况下可能是:

#include <stdint.h>

#define M_TABLE_SIZE ((intptr_t) (64*1024))
static const void* M_OFFSET = (void *) M_TABLE_SIZE;