C语言内存管理基本函数

Posted honortech

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言内存管理基本函数相关的知识,希望对你有一定的参考价值。

目录

1. malloc

  • 开辟成功则返回一个指向size个字节大小空间的指针,失败则返回NULL
  • 注意检查返回值,(尤其VS2019及以上)
  • 返回的指针为无类型指针,使用时注意类型转换
    int* p = (int*)malloc(20);

2. free

  • 参数为动态内存空间的地址

  • 释放后需手动置空,否则会导致野指针问题
    free(ptr);
    ptr = NULL;

  • 这里ptr指针中的地址并未被改,是其指向的内存空间被回收

  • 如果参数memblock为NULL,则会忽略指针,并立即返回

3. calloc

  • 参数为元素个数和每个元素字节大小
  • 会将开辟的空间的每个元素初始化为0
  • 其它与malloc不无相同

4. realloc

  • 参数为待调整内存空间的地址、调整后空间的字节数
  • 可能的情况
    • 原空间之后空间充足,直接追加空间至size大小
    • 原空间之后空间不够,在堆区中另觅一块size大小的空间来使用,并将原有的数据拷贝至这块空间,返回此空间的地址
    • 上述两种情况都不满足,即堆区中没有size大小的可用空间,返回NULL

因此使用realloc时注意检查返回值,并且将结果先存入一个中间变量

int* tmp = (int*)realloc(40);
	if (tmp == NULL)
	
		printf("realloc fail\\n");
		exit(-1);
	
	else
	
		memblock = tmp;
	

5. 常见错误

  • 对NULL指针解引用导致程序崩溃
    (应注意检查开辟空间的返回值)

  • 动态开辟内存空间的越界访问
    (判断空间使用率,需要时进行扩容)

  • free释放内存空间的一部分
    (不应改变内存空间起始位置的地址)

  • 对一块动态内存空间多次释放
    (free后立即置空)

  • 对free后的原内存空间地址解引用操作,造成非法访问内存空间
    (free后立即置空)

  • 忘记释放动态内存空间,造成内存泄漏
    (及时主动释放)

以上是关于C语言内存管理基本函数的主要内容,如果未能解决你的问题,请参考以下文章

C语言中内存分配 (转)

C语言中内存分配

JVM内存区域管理算法-垃圾回收算法

iOSDay08之C语言内存管理

C内存管理

C语言程序设计 学生成绩管理信息系统