静态内存是指程序开始运行时,由编译器自动分配和释放空间。程序中的各种变量,在程序编译时都需要分配空间,当函数调用完,空间自动释放。此时**用户不需要关心空间的申请与释放问题。**通常都储存在栈中。
例如:
int i=20;//在栈上开辟4字节的空间
char a[10]={0};//在栈上开辟10字节的空间
静态内存管理由两个特点:
1.空间开辟的大小时固定的
2.数组在声明的时候,必须指定数组的长度,它所需要的内存在编译时分配。
而动态内存分配,可以很好的解决上面的问题,当需要开辟的空间不确定时,静态内存管理就不好定义变量的大小,这是使用动态内存,可以得到一个变常数组,大小可以由自己开辟。并且动态内存可以提供大块的内存。
注意:动态内存是在堆上开辟的,必须由程序员申请释放
int a = 0;
scanf("%d", &a);
char *p = (char *)malloc(sizeof(char)*a);//在堆上开辟a字节的空间,
//用指针p指向在堆上开辟空间的首地址。p在栈上开辟空间
int *p=(int *)calloc(10,sizeof(int));//在堆上开辟40字节的空间,并且初始化为0。
int *prt=(int *)malloc(sizeof(int)*10);
int *p=(int *)realloc(prt.100);
注意:
prt=realloc(prt,100);//错误
如果prt空间小了,要调整大一点,如果realloc函数调整后,返回地址与原来不相同,prt指向新地址,但是prt原来的小地址空间还在,如果prt指向新地址,原来开辟的小的地址空间就找不到了。造成内存泄露。
#include
#include
int main()
{
int a = 0;
scanf("%d", &a);
int *p = (int *)malloc(sizeof(int)*a);
if (p == NULL){//判断空间是否开辟成功
printf("malloc error\n");
return 1;
}
for (int i = 0; i < a; i++){
*(p + i) = 0;
}
free(p);//是否开辟空间
p = NULL;//防止成为野指针
return 0;
}
注意点:
1. 动态开辟的空间必须free释放,不然会导致内存泄露
2.free函数只是切断了指针与堆(开辟的内存)之间的联系,指针里存的内容没变,只是不能指向堆了。为了防止指针变成野指针,最后要让指针指向NULL。
3.删除数据不是将数据全部清空,只是设成了无效。