将指针强制转换为int

时间:2014-03-25 03:09:17

标签: c pointers malloc heap sbrk

我正在C中为mallocfree编写自己的函数以进行赋值。我需要利用C sbrk()包装函数。根据我的理解sbrk()将程序的数据空间增加了作为参数传递的字节数,并指向程序中断的位置。

如果我有以下代码段:

#define BLOCK_SIZE 20

int x;

x = (int)sbrk(BLOCK_SIZE + 4);

我收到编译错误warning: cast from pointer to integer of different size。为什么这样,无论如何我可以将sbrk()指向的地址转换为int

1 个答案:

答案 0 :(得分:6)

  

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

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

  

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

如果你真的需要指向一个整数的指针,你应该将其从intptr_t转换为uintptr_t<stdint.h>


来自<stdint.h>(P)

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

以下类型指定一个带符号的整数类型,其属性是任何有效的void指针都可以转换为此类型,然后转换回指向void的指针,结果将等于原始指针:{{1 }}

     

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

     

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