动态内存:
#include<stdlib.h>
前提引入:
- 局部变量储存在 栈空间,vs2022 内分配 (1024*1024)=1m 大小,超过此大小程序崩溃
- char* s = strtok(buff, " ");//当指针定义在外部函数时,为函数内部的局部变量,函数结束时会结束生命周期,即使return *指针,也无法实现返回内容,则适用于使用动态申请定义指针,则在free()前可以全局使用
- 动态内存储存在 堆空间,分配较大内存,适用于定义大容量(1G左右)
- 动态内存申请连续内存
malloc
参数:只需要申请空间的大小 n
(void*)malloc( n * sizeof(--) );
内存充裕时,返回申请成功的指针,否则返回NULL (assert 断言不为NULL);
calloc
(void*)calloc( n , sizeof(--) );
对比malloc 没有默认值,而calloc 申请的内容,指针指向默认初始值都为0
memset(指针,0,字节总数);//重新初始化全部为0
扩容:realloc
malloc\calloc 申请内存不够使用时,再次申请扩大需要的内存
(void*)realloc( 原申请指针 , size(更大的总内存字节大小) );
size:需要分配的总内存大小,不是重新添加的大小
返回值:!!接受新的申请地址
free:
释放申请的内存,否则出现内存泄漏(申请后未使用、未释放,导致其他程序无法使用)
泄露的内存回收:
- 在程序(进程)结束后回收
- 关机(重启)
内存泄漏非常严重的错误:难发现、难修改
- #include<vld.h> 在内存泄漏时报告,需要插件 /桌面/学习/C/vld
free() 导致程序崩溃是为什么?
- 写入内容超过申请内存大小:越界;
- 使用过程,申请的返回指针使用时移动 eg: P++;作为数组使用P[i++],无影响
- 重复释放同一内存,free两次
const
作用 :
定义常量(不能修改,不能改写).
例如 const int ca = 10; ca=20;//error
特点:
- 基本类型对于const透明. 例如 int double char......
const int ca = 10; 等价 int const ca = 10;
- const限定它的"直接"右边
- const int *p; 类型可自动忽略,只限定” *p “ 单独则代表指针解引用->值 不可变
- int * const p; 类型可自动忽略,只限定 ” p “ 单独则代表指针地址 ->地址 不可变
- 其主要应用场景:如果形参是指针,同时不允许修改实参的值,那么在指针前面加const
- 权限在传递时可以同等传递,也可以缩小传递,但不能扩大 ->我可读,传递给他人也仅可读,他人不可写(权力放大)