c语言与动态内存

前言

在C语言中,除了获取变量的指针这种规矩的内存空间,我们还可以通过函数去申请指定大小的内存空间

动态

malloc

malloc可以申请一块任意尺寸的空间,因为经常一段空间是连续的

#include <stdio.h>
#include <stdlib.h>

int main(void) {
	int *ptr = NULL;
    	ptr = (int *) malloc(sizeof(int)); // malloc() 返回一个void *类型指针
    	if (ptr == NULL) {
           	printf("获取内存失败");
            	exit(0);
    	}
    	*ptr = 4;
    	printf("*ptr = %d\n", *ptr);
    	return 0;
}

Output: *ptr = 4

解析

void * malloc(size_t size)

  1. 声明一个空指针
  2. 使用malloc函数申请一个连续空间,尺寸为int类型的长度,并将指针类型转换为int类型的指针
  3. 判断是否申请成功,若成功则继续,若不成功则退出
  4. 为ptr赋值
  5. 输出

可以在 (int *) malloc(sizeof(int)) 这里做一个小修改 (int *) malloc(sizeof(int) * 3),这样我们就得到一个长度为3的常量数组,可以直接使用数组的方式去操作ptr指针

内存泄漏

#include <stdio.h>
#include <stdlib.h>

int main(void) {
	while(1) {
		malloc(1024);
	}
    	return 0;
}

如果你尝试在你的电脑上运行这段代码,我可能已经看到你在运行过后的表情会是怎样的了。年轻的我不信邪的做了一把死,结果导致我很多没有保存正在做的文件都要重新来过,如果你不想和我一样,最好找个虚拟机

Warning: Nuclear missile launched! (警告:感应到在途的核打击)

由于C语言并没有GC(垃圾回收机制),所以它并不会主动的被动的释放空间,那么如果我们一直申请空间,并且不去释放它,那么会导致剩余空间越来越小,以至于电脑直接死机

free

那么C语言为了避免这种情况,在stdlib.h这个C标准库内,有一个 void free(void * ptr) 函数,此函数的作用是释放由 malloccallocrealloc这三个函数所申请的内存空间,如果参数是一个空指针,那么不会发生任何变化

#include <stdio.h>
#include <stdlib.h>

int main(void) {
        int *num;
        num = (int *) malloc(sizeof(int));
        *num = 10;
        printf("num: %d, addr: %p\n", *num, num);
        free(num);
        printf("num: %d, addr: %p\n", *num, num);
        return 0;
}

解析

  1. 声明一个int类型指针
  2. 申请一块大小为一个int类型长度的内存块,并转换类型为int指针
  3. 给num赋值为10
  4. 输出num的值和地址 // num: 10, addr: 0x7ffff58f5260
  5. 释放num指针
  6. 再次输出num的值和地址 // num: 0, addr: 0x7ffff58f5260

free不会改变指针变量本身的值,调用free后它仍然指向相同的内存空间,但是该内存已无效,不能使用,所以建议在free后将指针设置为空指针

樱花正含苞待放,春天就要来了🌸
标题:c语言与动态内存
作者:bogendihong
地址:https://myjinji.top/articles/2020/09/21/1600683862550.html

评论

取消