我试图从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 *的正确方法是什么?
答案 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_t
和uintptr_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;