【发布时间】:2017-11-13 00:13:53
【问题描述】:
我正在学习c程序的内存管理。我有一个很好的疑问。 (Ubuntu 操作系统)
我的疑问:
我想知道位于堆栈和堆内的数据的地址。但是当我尝试打印这些地址时,我发现地址的长度是不同的! 这里的问题是为什么它显示的堆栈地址比堆地址长?
我知道的:
- 每个进程的堆栈内存是固定的,小于堆内存。
- malloc() 在堆上分配内存
- 局部变量入栈
我把我的演示代码放在这里,这样你就可以很好地回答我的疑问了。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *ptr; // goes on stack
ptr = (int *)malloc(sizeof(int));
*ptr = 10; // 10 is stored on heap
printf("%p : heap address\n",ptr);
printf("%p: stack address\n",&ptr);
return 0;
}
输出: 我在终端中得到了以下输出
0x1ea2010 : heap address
0x7ffda62cb3c0: stack address
所以现在你可能明白我在问什么了。为什么栈地址比堆地址长?堆是一个很大的内存池,所以显然它应该有更多的长度。
如果堆栈和堆分配是在同一个内存块中完成的(根据现代操作系统..我在某处读过这个),那么它也应该具有相同的长度。
好的。请帮我把我的记忆概念弄得一清二楚。
注意:如果我的疑问非常简单或愚蠢,那么至少也请让我知道我的演示代码中的内存分配是如何完成的,以及不同长度地址背后的魔法。
感谢您阅读此类帖子。回答愉快!
【问题讨论】:
-
这些只是您要打印的虚拟地址。由于动态链接,无法确定内存的实际物理地址。如果我错了,请有人纠正我。
-
来自 C 标准关于
%p转换类型说明符:“指针的值以实现定义的方式转换为打印字符序列。 ”。你应该区分这个输出和内部表示。请提供对要求堆栈地址不得大于堆地址的标准的参考(或根本需要堆栈或堆)。 -
“如果堆栈和堆分配在同一个内存块中完成(根据现代操作系统..我在某处读过这个)” - 不要相信一些晦涩的网站写的一切。这没有任何意义。您应该要求作者澄清。
-
@Parth 通常堆栈向零地址的方向增长。这解释了 0x7ffda62cb3c0 这么大的值。例如尝试定义一个包含许多元素的本地数组,你会发现它的地址小于你得到的值。
-
@Parth 请在下面查看我的答案,看看是否有帮助。
标签: c memory-management malloc heap-memory stack-memory