我正在C中为malloc
和free
编写自己的函数以进行赋值。我需要利用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
?
答案 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_t
和uintptr_t
类型;否则,它们是可选的。