内存分配
C语言中,malloc ()和realloc ()来完成动态分配内存的任务。而分配的内存就在堆中,堆是一块内存中不连续的区域,由一个记录空闲内存地址的链表来实现其内存的分配。
释放内存使用free ()函数。
在C++中,使用new开辟新的内存,使用delete释放内存。
如下程序所示,堆内存的分配并不是连续的。
#include<stdio.h>
#include<stdlib.h>
int sum(int x,int y)
{
int su; //局部变量
int su1;
su = x+y;
printf("程序栈中:\n");
printf("局部变量y的地址是%X\n",&y);
printf("局部变量x的地址是%X\n",&x);
printf("局部变量su的地址是%X\n",&su);
printf("局部变量su1的地址是%X\n",&su1);
return su;
}
void main()
{
int *a;
int *b;
int *c;
a = (int *)malloc(sizeof(int)*10000);
b = (int *)malloc(sizeof(int)*10000);
c = (int *)malloc(sizeof(int)*10000);
printf("堆中:\n");
printf("a的地址是0x%d\n",a);
printf("b的地址是0x%d\n",b);
printf("c的地址是0x%d\n",c);
sum(1,2);
free(a);
free(b);
free(c);
}
栈的分配是系统自动控制的,没有具体的函数接口可以去操作。如上面程序所示,局部变量和函数参数存在在栈中,且向低地址连续存储。
空间大小
由此还可以知道栈与堆的一个重要区别就是,堆获取内存空间比较灵活,而栈是想低地址扩展的,所以会有具体的大小限制。