繁体   English   中英

将int转换为void *

[英]Cast int to void*

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

这个

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放在方括号内,以免引起意外。

除非您在该值上有一个有效地址,否则在尝试使用该指针时将调用未定义的行为 因此,请确保您了解自己在做什么!

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

static const void* M_OFFSET = 64*1024;

您尝试执行的操作不太可能。

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

对于较新的编译器(支持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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM