【C语言】解析动态内存分配函数——malloc()函数、calloc()函数、realloc()函数

简介: 【C语言】解析动态内存分配函数——malloc()函数、calloc()函数、realloc()函数

前言

动态内存和使用静态内存的对比:

  静态内存空间开辟大小是固定的建立在栈上,不管用多少都会开辟指定大小,并且无法释放;反观动态内存空间开辟在堆上,不管开辟多少,最终会释放。

头文件:stdlib.h

注:C语言提供了另外一个函数free,专门是用来做动态内存的释放和回收的,函数原型

void free (void* ptr);


1.malloc()函数

函数参数

开辟一个大小位size(字节)的连续空间,若开辟成功返回类型是一个无符号类型的指针,若开辟不成功就返回空指针(NULL)。

void* malloc (size_t size);

函数使用实例

include <stdio.h>
int main()
{
 int* ptr (int*)malloc(40);
 if(NULL != ptr)//判断ptr指针是否为空
 {
     int i = 0;
     for(i=0; i<10; i++)
     {
     *(ptr+i) = 0;
     }
 }
 free(ptr);//释放ptr所指向的动态内存
 ptr = NULL;
 return 0;
}


2.calloc()函数

函数参数

函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0,若开辟成功返回类型是一个无符号类型的指针,若开辟不成功就返回空指针(NULL)。

该函数相当于malloc()函数+memset()函数的结合体。

void* calloc (size_t num, size_t size);

函数使用实例

#include <stdio.h>
#include <stdlib.h>
int main()
{
 int *p = (int*)calloc(10, sizeof(int));
 if(NULL != p)
 {
     int i = 0;
     for(i=0; i<10; i++)
     {
     *(p+i) = 0;
     }
}
 free(p);
 p = NULL;
 return 0;
}



3.reaclloc()函数

函数参数

将ptr指到的地方扩大(缩小)到size大小。

返回值为调整之后的内存起始位置。

void* realloc (void* ptr, size_t size);

该函数使用时有两者情况:

情况一:原有空间之后有足够大的空间

要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化。



情况二:原有空间之后没有足够大的空间

原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小的连续空间来使用。这样函数返回的是一个新的内存地址。 由于上述的两种情况,realloc函数的使用就要注意一些。



函数使用实例

#include <stdio.h>
int main()
{
 int *ptr = (int*)malloc(100);
 if(ptr != NULL)
 {
     //业务处理
 }
 else
 {
     return 1;    
 }
 //扩展容量
 //代码1
 ptr = (int*)realloc(ptr, 1000);
 //代码2
 int*p = NULL;
 p = realloc(ptr, 1000);
 if(p != NULL)
 {
 ptr = p;
 }
 //业务处理
 free(ptr);
 return 0;
}
相关文章
|
4天前
|
机器学习/深度学习 算法 Linux
xenomai内核解析--实时内存管理--xnheap
Xenomai是一个实时操作系统(RTOS)层,用于Linux,旨在提供确定性的任务调度和服务。其内存管理机制包括一个名为xnheap的内存池,确保内存分配和释放的时间确定性,以满足硬实时系统的严格需求。
12 0
xenomai内核解析--实时内存管理--xnheap
|
4天前
|
存储 编译器 C语言
C语言:字符函数 & 字符串函数 & 内存函数
C语言:字符函数 & 字符串函数 & 内存函数
11 2
|
5天前
|
缓存 Java 编译器
JMM内存模型 volatile关键字解析
JMM内存模型 volatile关键字解析
10 0
|
7天前
|
编译器
练习使用动态内存相关的4个函数:malloc、calloc、realloc、free
在了解使用动态内存相关的四个函数之前,我们先了解一下,为什么要有动态内存分配?
15 0
|
8天前
|
存储 编译器 C++
【C++】内存管理和模板基础(new、delete、类及函数模板)
【C++】内存管理和模板基础(new、delete、类及函数模板)
21 1
|
19天前
|
C语言
C语言:内存函数(memcpy memmove memset memcmp使用)
C语言:内存函数(memcpy memmove memset memcmp使用)
|
13天前
|
缓存 安全 编译器
【C 言专栏】C 语言函数的高效编程技巧
【5月更文挑战第1天】本文探讨了C语言中函数的高效编程技巧,包括函数的定义与作用(如代码复用和提高可读性)、设计原则(单一职责和接口简洁)、参数传递方式(值传递、指针传递和引用传递)、返回值管理、调用约定、嵌套与递归调用,以及函数优化技巧和常见错误避免。掌握这些技巧能提升C语言代码的质量和效率。
【C 言专栏】C 语言函数的高效编程技巧
|
15天前
|
C语言
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
|
15天前
|
C语言
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
|
15天前
|
C语言
(浙大版《C语言程序设计(第3版)》 习题6-5 使用函数验证哥德巴赫猜想 (20分)
(浙大版《C语言程序设计(第3版)》 习题6-5 使用函数验证哥德巴赫猜想 (20分)