将指针转换为 int
Posted
技术标签:
【中文标题】将指针转换为 int【英文标题】:Casting a pointer to an int 【发布时间】:2014-05-02 17:09:27 【问题描述】:我正在用 C 语言为 malloc
和 free
编写自己的函数以进行分配。我需要利用 C sbrk()
包装函数。据我了解sbrk()
将程序的数据空间增加作为参数传递的字节数并指向程序中断的位置。
如果我有以下代码sn-p:
#define BLOCK_SIZE 20
int x;
x = (int)sbrk(BLOCK_SIZE + 4);
我收到编译器错误warning: cast from pointer to integer of different size
。为什么会这样,无论如何我可以将sbrk()
指向的地址转换为int
?
【问题讨论】:
有什么理由不使用void *x;
吗?如果你真的想要一个整数类型,那么intptr_t x = (intptr_t)sbrk...;
来自<stdint.h>
因为 int 是 32 位,所以指针是 64 位。尝试使用 long int。尝试检查 sizeof(int) 和 sizeof(void*)
【参考方案1】:
我收到编译器错误警告:从指针转换为不同大小的整数。 这是为什么呢
因为指针和int
可能有不同的长度,例如在64位系统上,sizeof(void *)
(即指针的长度)通常是8,而sizeof(int)
通常是4。在这种情况下,如果你将指针转换为int
并将其转换回来,您将得到一个无效指针而不是原始指针。
无论如何我可以将 sbrk() 指向的地址转换为 int 吗?
如果您确实需要将指针转换为整数,则应将其转换为 intptr_t
或 uintptr_t
,从 <stdint.h>
。
来自<stdint.h>(P)
:
能够保存对象指针的整数类型以下类型指定有符号整数类型,其属性是任何指向 void 的有效指针都可以转换为该类型,然后转换回指向 void 的指针,结果将与原始指针比较:
intptr_t
以下类型指定一个无符号整数类型,其属性是任何指向 void 的有效指针都可以转换为该类型,然后转换回指向 void 的指针,结果将与原始指针进行比较:
uintptr_t
在符合 XSI 的系统上,
intptr_t
和uintptr_t
类型是必需的;否则,它们是可选的。
【讨论】:
我尝试将其转换为intptr_t
并编译。我试图将其转换为int
的原因是我可以查看堆上是否还有更多空间。如果在我上面的代码 sn-p 中,x 小于 0,那么堆上就没有更多空间了。以上是关于将指针转换为 int的主要内容,如果未能解决你的问题,请参考以下文章
(c++) 将 int 转换为 char 指针(int 是 int 形式的字符)
如何将文件指针 ( FILE* fp ) 转换为文件描述符 (int fd)?
如何将文件描述符(int fd)转换为文件指针(FILE * fp)