C - sbrk(size)返回有效指针,但sbrk(0)是负值

时间:2017-03-07 01:11:41

标签: c pointers memory-management memory-leaks sbrk

我的分配代码是

dat* data = NULL;
data = sbrk(SIZE);
if((int) data != -1){
   return data
}else{
  printf("Not enough space");
}

sbrk(...)函数返回一个有效的地址(0x603021)但是当我进入gdb并打印sbrk(0)时,我得到了十六进制值0xffffffff8060341。做完数学后我发现指针0x8060341应该是sbrk(0)。前面的字母f(即0xfffff ...)来自哪里?

1 个答案:

答案 0 :(得分:1)

gdb显示内存段的完整64位地址。十六进制中的64位地址需要16个总十六进制数字(0-9,A-F)才能完全指定。从每位64位/ 4位= 16。

如果你看到更少,那是因为编辑器正在截断内存地址的前32位(8个十六进制数字),只显示剩余的8位或更低的8位。这是来自32位计算世界的宿醉,其中有8个十六进制数字足以完全指定内存地址。