我的分配代码是
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 ...)来自哪里?
答案 0 :(得分:1)
gdb显示内存段的完整64位地址。十六进制中的64位地址需要16个总十六进制数字(0-9,A-F)才能完全指定。从每位64位/ 4位= 16。
如果你看到更少,那是因为编辑器正在截断内存地址的前32位(8个十六进制数字),只显示剩余的8位或更低的8位。这是来自32位计算世界的宿醉,其中有8个十六进制数字足以完全指定内存地址。