【发布时间】:2017-03-07 01:11:40
【问题描述】:
我的分配代码是
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...)是哪里来的?
【问题讨论】:
-
你能告诉我们确切你做了什么吗?您准确地获得了您所询问的价值吗?
-
更确切地说,您是如何获得
0xffffffff8060341的价值的?看起来您可能在某处涉及到标志扩展。也许你还有其他奇怪的(int)演员?您当前发布的代码中的那个在 64 位拱门上肯定是无效的。 -
另外,您是否正确包含
unistd.h和/或编译时带有警告?您的问题可能是由sbrk隐式声明为int (*)(int)引起的。 -
在 gdb 中调试时,我只是输入了 - p (void*) sbrk(0) - 并且还声明了 unistd.h
-
不要描述你做了什么 - 展示一个简短的工作程序和一个 gdb 会话的记录来证明问题。
标签: c pointers memory-management memory-leaks sbrk