总排序
代码段(text)
数据段(data)
BSS段
堆
栈
栈里存放着局部变量,函数的参数,函数的返回值。
堆和栈的区别
实验证明:
结果:
在主函数里可以成功访问到一个在其他函数的局部变量的值,事实证明在堆里申请一个内存空间,并赋值,再把堆的地址返回,可以成功访问到这个局部变量的值。(即证明了堆的生存空间由动态申请到主动释放为止)(在以往的代码中是不可以实现访问到此类局部变量的值的)
这仅仅是实验代码,不推荐在函数中使用malloc申请空间之后在主函数中free。应该在哪个函数malloc就在哪free。
发展方向
验证:
#include <stdio.h>
int main(void)
{
int* ptr1 = NULL;
int* ptr2 = NULL;
ptr1 = (int*)malloc(sizeof(int));
ptr2 = (int*)malloc(sizeof(int));
printf("stack : %p -> %p\n", &ptr1, &ptr2);
printf("heap : %p -> %p\n", ptr1, ptr2);
return 0;
}
我的结果:
小甲鱼的结果:
可知stack(堆)由低地址向高地址发展;
heap(栈)由高地址向低地址发展。
再用realloc重新给ptr1申请更大的空间时,因为ptr1后接着ptr2,所以位置不够,编译器会再找一个位置来给ptr1。如结果所示。
小甲鱼的结果: