且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

铸造一个指针为int

更新时间:2023-12-01 08:38:10


  

我得到的编译器错误警告:一个指针转换为大小不同的整数结果。
  这是为什么


块引用>

由于指针和 INT 可能有不同的长度,例如,在64位系统中,的sizeof(无效*)(即指针的长度),通常为8,但的sizeof(INT)通常在此情况下,如果你投一个指向 INT 丢回来,你会得到一个无效的指针,而不是原来的指针。


  

和有反正我可以SBRK()投下的地址指向一个int?


块引用>

如果你真的需要一个指针转换为整数,你应该把它转换为一个使用intptr_t uintptr_t形式< stdint.h方式>


< stdint.h>(P)


  

      
  • 整数类型可容纳对象指针

  •   

  
  

以下类型表示与任何有效的指针作废可以转换为这种类型的属性有符号整数类型,则转换回指针作废,结果会比较等于原始指针:使用intptr_t


  
  

以下类型表示与任何有效的指针作废可以转换为这种类型的属性的无符号整数类型,则转换回指针作废,结果会比较等于原始指针: uintptr_t形式


  
  

在XSI兼容的系统中,使用intptr_t uintptr_t形式是必需的类型;否则,它们是可选的。


块引用>

I am writing my own functions for malloc and free in C for an assignment. I need to take advantage of the C sbrk() wrapper function. From what I understand sbrk() increments the program's data space by the number of bytes passed as an argument and points to the location of the program break.

If I have the following code snippet:

#define BLOCK_SIZE 20

int x;

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

I get the compiler error warning: cast from pointer to integer of different size. Why is this and is there anyway I can cast the address pointed to by sbrk() to an int?

I get the compiler error warning: cast from pointer to integer of different size.
Why is this

Because pointer and int may have different length, for example, on 64-bit system, sizeof(void *) (i.e. length of pointer) usually is 8, but sizeof(int) usually is 4. In this case, if you cast a pointer to an int and cast it back, you will get a invalid pointer instead of the original pointer.

and is there anyway I can cast the address pointed to by sbrk() to an int?

If you really need to cast a pointer to an integer, you should cast it to an intptr_t or uintptr_t, from <stdint.h>.


From <stdint.h>(P):

  • Integer types capable of holding object pointers

The following type designates a signed integer type with the property that any valid pointer to void can be converted to this type, then converted back to a pointer to void, and the result will compare equal to the original pointer: intptr_t

The following type designates an unsigned integer type with the property that any valid pointer to void can be converted to this type, then converted back to a pointer to void, and the result will compare equal to the original pointer: uintptr_t

On XSI-conformant systems, the intptr_t and uintptr_t types are required; otherwise, they are optional.