c语言|C语言精华——内存管理,很多学校学习不到的知识~

文章图片

文章图片

在编写程序时 , 通常并不知道需要处理的数据量 , 或者难以评估所需处理数据量的变动程度 。 在这种情况下 , 要达到有效的资源利用——使用内存管理 , 必须在运行时动态地分配所需内存 , 并在使用完毕后尽早释放不需要的内存 , 这就是动态内存管理原理 。 动态内存管理同时还具有一个优点:当程序在具有更多内存的系统上需要处理更多数据时 , 不需要重写程序 。 一、动态内存分配1、malloc函数能够在堆中动态地分配一块指定大小的内存空间 。 malloc中文叫\t动态内存分配 , 用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址 , 当无法知道内存具体位置的时候 , 想要绑定真正的内存空间 , 就需要用到动态的分配内存 , 且分配的大小就是程序要求的大小 。
函数原型:
void* malloc(unsigned int size);
返回:返回一个指向被分配的内存块起始位置
失败返回NULL指针 , 说明没有分配成功 。
2、泛型指针void*
相同类型的指针可以相互转化 , 泛型指针就是:可以转化成任何类型的指针
int *p = malloc(sizeof(int));
if (p != NULL)
{
printf(\"动态开辟内存成功.\\");
else
{
printf(\"失败\\");
*p = 45;
char *p1=malloc(sizeof(char));
*p1 = 'A';
//是分配的一块连续的内存空间
3、calloc函数
有时候 , 我们在程序中需要一段内存来处理数据 , 但是又不确定是要多大内存的情况下 , 比如 我们申请一个数组 a[100
但是事前我们并不知道会不会用得完这100个元素 , 比如我们只会用到10个 , 那么剩下的90个就会还在占用空间 , 就显得很浪费空间 , 这时候使用calloc函数是用来在内存的\t动态存储 区中(堆中)分配一个连续存储空间 。
//函数原型:
void *calloc( size_t numsize_t size);
//分配的这块空间 会被初始化为0
//num Number of elements.
size Length in bytes of each element.
//效率: malloc效率要高 , calloc还要将里面初始化为0.
4、realloc函数用于修改原先已经分配好了的内存空间大小 , realloc()函数可以重用或扩展以前用malloc()、calloc()及realloc()函数自身分配的内存 。
函数原型:
void *realloc( void *memblocksize_t size);
memblock Pointer to previously allocated memory block.
size New size in bytes.
//扩大:
//缩小:
5、内存释放free();
//函数原型
void free(void *memblock);
int *p=malloc(sizeof(int) * 5);
p[0
= 11;
p[1
= 22;
p[2
= 33;
p[3
= 44;
p[4
= 55;
for (int i = 0; i < 5;i++)
{
printf(\"%d\\t\"p[i
);
printf(\"\\");
//释放这块内存空间
free(p);
//p野指针指向一块非法的内存空间
6、内存泄漏对于任何使用 C 语言的人 , 如果问他们 C 语言的最大烦恼是什么 , 其中许多人可能会回答说是指针和内存泄漏 。
在计算机科学中 , 内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存 。 内存泄漏并非指内存在物理上的消失 , 而是应用程序分配某段内存后 , 由于设计错误 , 导致在释放该段内存之前就失去了对该段内存的控制 , 从而造成了内存的浪费 。
推荐阅读
- 手机内存不足别乱删,学会这5个技巧,让手机释放大量空间
- 大一非计算机专业的学生,如何利用寒假自学C语言
- Intel 11代酷睿逼近7GHz!内存超至6666.66MHz
- 内存大厂跨界之作!芝奇Enki 360一体式水冷评测:高密度冷排稳压18核心
- 旗舰|OPPO Find X3曝光:骁龙888/12G内存
- 威刚为英特尔12代Alder Lake平台准备了64GB DDR5-8400内存模组
- 曝Redmi Note 10 Pro获认证:8GB内存
- 三星让渡部分DRAM产能:内存价格或暴涨
- vivo新机亮相跑分平台 配8GB内存搭载天玑820芯片
- Linus Torvalds谈ECC内存的重要性 痛斥英特尔正在扼杀它
