马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
测试代码如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *ptr1 = NULL;
int *ptr2 = NULL;
ptr1 = (int *)malloc(sizeof(int));
if(ptr1 == NULL)
{
exit(1);
}
ptr2 = (int *)malloc(sizeof(int));
if(ptr2 == NULL)
{
exit(1);
}
printf("stack:&ptr1-%p | &ptr2-%p\n",&ptr1,&ptr2);
printf("heap:ptr1-%p | ptr2-%p\n",ptr1,ptr2);
ptr1 = realloc(ptr1,2 * sizeof(int));
printf("realloc ptr1 -> 2 * sizeof(int):%p\n",ptr1);
ptr1 = realloc(ptr1,20 * sizeof(int));
printf("realloc ptr1 -> 20 * sizeof(int):%p\n",ptr1);
//str1的内存地址取决于realloc的大小
return 0;
}
运行结果:
stack:&ptr1-000000000061FE18 | &ptr2-000000000061FE10
heap:ptr1-0000000000B05E00 | ptr2-0000000000B05E20
realloc ptr1 -> 2 * sizeof(int):0000000000B05E00
realloc ptr1 -> 20 * sizeof(int):0000000000B06E50
Process returned 0 (0x0) execution time : 0.052 s
Press any key to continue.
为什么运行结果发现堆比栈的内存地址还大
不应该是栈比堆在内存空间的位置更高吗?
在你的测试代码中,ptr1和ptr2是指向堆内存分配的指针。由于内存布局的原因,栈内存通常位于高地址,而堆内存通常位于低地址。因此,从理论上讲,栈的地址应该比堆的地址更高。
然而,在实际情况下,如你所观察到的,堆的地址似乎更高,这是由于编译器和操作系统的具体实现方式引起的。具体来说,当你运行程序时,操作系统会为进程分配虚拟地址空间,并将其划分为不同的区域,如代码区、数据区(包括全局变量和静态变量)、堆和栈等。
栈通常是预先分配的,它的地址确实位于高地址段,所以栈的地址是递减的。而堆是在运行时动态分配的,操作系统会根据需要动态分配内存,因此堆的地址是递增的。
另外,需要注意的是,栈和堆之间存在一定的间隔或重叠,所以栈的地址和堆的地址并不总是严格遵循高地址和低地址的关系。
总的来说,堆和栈的内存地址并不遵循一个固定的规则。根据操作系统和编译器的不同实现,它们的位置可能会有所不同。因此,在编程中,不应该依赖于堆和栈的地址相对关系,而是应该使用指针来访问它们所指向的内存区域。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
|