一.内存静态分配
静态:在编译时创建,需要合理利用不然会一直浪费资源(不关闭程序不会销毁)
1 全局变量
前要:全局变量写在任何函数体之外,且任何函数都可以调用
内容:全局变量可跨文件调用
2 静态全局变量
格式:static int a = 55;
区别:只能在该文件内调用生效
3 静态局部变量
#include<stdio.h>
extern void no();
int main(){
no();
no();
no();
}
void no(){
static int dada = 5;
dada++;
printf("%d",dada);
}
运行结果:678
但是:没有static 运行结果是666;因为有static在编译时就分配了地址,程序不结束不会销毁,而函数是调用时创建,结束便销毁
二. 内存动态分配
解释:包含函数内的变量都是普通分配的,创建时分配地址,函数调用完毕就会销毁地址;下面介绍这个属于动态创建,函数使用完后并不会销毁(程序结束销毁;free销毁)
1 前要
意义:在未知用户输入需要数组大小的前提下,进行分配,这样能合理分配空间,避免资源浪费
需要:#include <stdlib.h>
2 动态分配与普通分配的区别
区别:C语言,提到的区域大致上分为栈区,堆区,和静态区;普通分配分布在栈区;动态分配分布在堆区,全局变量和静态变量分布在静态区
3 使用
3.1 malloc()
解释:初始化
格式:指针 = (int *)malloc(sizeof(int)*a)
需要强制转换,括号填写需要字节的大小
重点:需要free释放内存,不然不会自己释放
结果:成功返回指针的地址,失败返回空指针NULL
3.2 realloc()
解释:改变大小
原理:先判断当前的指针是否有足够的连续空间,如果有,扩大原指针指向的地址,并且将 原指针返回;如果空间不够,先按照新指针指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,同时返回新分配的内存区域的首地址,然后释放旧的地址。
格式:p1 = (int*)realloc(p, sizeof(int) * 15);
需要强制转换,第一个参数放malloc初始化的指针,第二个放更改后的总大小
结果:成功返回指针的地址,失败返回空指针NULL
3.3 free()
解释:释放
格式:free(p)
释放前面成功创建内存,参数里面填分配的指针指针,系统不会自动释放