【问题标题】:Casting a pointer to an int将指针转换为 int
【发布时间】:2014-05-02 17:09:27
【问题描述】:

我正在用 C 语言为 mallocfree 编写自己的函数以进行分配。我需要利用 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*)

标签: c pointers malloc heap-memory sbrk


【解决方案1】:

我收到编译器错误警告:从指针转换为不同大小的整数。
这是为什么呢

因为指针和int可能有不同的长度,例如在64位系统上,sizeof(void *)(即指针的长度)通常是8,而sizeof(int)通常是4。在这种情况下,如果你将指针转换为int 并将其转换回来,您将得到一个无效指针而不是原始指针。

无论如何我可以将 sbrk() 指向的地址转换为 int 吗?

如果您确实需要将指针转换为整数,则应将其转换为 intptr_tuintptr_t,从 <stdint.h>


来自<stdint.h>(P)

  • 能够保存对象指针的整数类型

以下类型指定有符号整数类型,其属性是任何指向 void 的有效指针都可以转换为该类型,然后转换回指向 void 的指针,结果将与原始指针比较:intptr_t

以下类型指定一个无符号整数类型,其属性是任何指向 void 的有效指针都可以转换为该类型,然后转换回指向 void 的指针,结果将与原始指针进行比较:uintptr_t

在符合 XSI 的系统上,intptr_tuintptr_t 类型是必需的;否则,它们是可选的。

【讨论】:

  • 我尝试将其转换为 intptr_t 并编译。我试图将其转换为int 的原因是我可以查看堆上是否还有更多空间。如果在我上面的代码 sn-p 中,x 小于 0,那么堆上就没有更多空间了。
猜你喜欢
  • 2017-02-12
  • 2012-03-02
  • 1970-01-01
  • 2013-11-18
  • 2017-07-25
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多