3

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

如果我有以下代码片段:

#define BLOCK_SIZE 20

int x;

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

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

4

1 回答 1

11

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

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

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

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


来自<stdint.h>(P)

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

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

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

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

于 2014-03-25T03:24:57.023 回答