C 将int转换为void*

C 将int转换为void*,c,pointers,gcc,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*的正确方法是什么?首先,您使用的是define,它不是变量。 预处理器将用以下内容替换您的代码: static const v

我试图从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*的正确方法是什么?

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

static const void* M_OFFSET = 64*1024;
这不太可能是你想要做的

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

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
放在括号中以避免这种意外总是一种好的做法


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

对于最近的编译器(支持C99),您不应该将地址存储或表示为普通
int
值。如果你真的需要这样的诡计,那么就考虑一个专用类型,即“代码> ItpTrpt和<代码> uutpTrpt。参考N1570 7.20.1.4/p1(能够容纳对象指针的整数类型):

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

intptr\u t

以下类型使用 属性,任何指向void的有效指针都可以转换为此类型, 然后转换回指向void的指针,并比较结果 等于原始指针:

uintpttr\u t

这些类型是可选的

在您的情况下,可能是:

#include <stdint.h>

#define M_TABLE_SIZE ((intptr_t) (64*1024))
static const void* M_OFFSET = (void *) M_TABLE_SIZE;
#包括
#定义M_表的大小((intptr_t)(64*1024))
静态常量void*M_OFFSET=(void*)M_TABLE_SIZE;

可能会对您有所帮助。我想用一桶汽油做一个奶酪蛋糕。但是我妻子总是警告我不能把汽油放进烤箱。我也试着用手直接揉捏汽油,但是我无法得到想要的奶酪蛋糕的质地。把汽油变成奶酪蛋糕的正确方法是什么?
static const void*M_OFFSET=(void*)(M_TABLE_SIZE)一旦你成功投出这个角色,那又怎么样?!我想另一个重要的事实是,强制转换运算符比乘法具有更高的优先级operator@BlueMoon谢谢!我假设gcc根据我的定义生成了65536,但我错了。预处理器绝对不会执行算术运算。你是对的!谢谢你指出这一点。刚刚编辑。然而,我相信即使定义是针对“65536”,它也不是@kaetzacoatl想要的。