malloc、calloc、realloc、free函数的使用

2023-11-20

malloc、realloc、calloc、free函数大部分在  stdlib.h  文件中

malloc 函数:从堆上分配内存

calloc 函数: 从堆上分配内存并清零

realloc 函数:在之前分配的内存块的基础上,将内存重新分配为更大或者更小的部分

free    函数:将内存块返回堆

 

一、malloc函数

C 库函数 void *malloc(size_t size) 分配所需的内存空间,并返回一个指向它的指针。如果内存不足,则会返回NULL。

1、从堆上分配内存

2、内存不会被修改或者清空

3、返回首字节的地址

4、malloc可分配的最大内存是跟系统相关的

5、初始化全局变量用malloc函数,,不能使用赋值语句的形式在外部赋值,必须出现在函数中。(例子2)

6、初始化不能使用静态。(例子3)

例1

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char *str;
    str = (char *)malloc(6);//申请一个6个char类型的内存
    strcpy(str, "ABCDE");//字符  A B C D E '\0'  共6个
    printf("String = %s,  Address = %u\n", str, str);
    
}

当malloc无法分配内存时候会返回NULL,可以用下面的方法进去检查是不错的做法。

#include <stdio.h>
#include <stdlib.h>
int main()
{
   
     int*str = (int *)malloc(sizeof(int));
    if(str !=NULL)
    {
         printf("true\r\n");
    }
    else
    {
        printf("false\r\n");
    }
 
    
}

例2

错误写法

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

char  *str;
str = (char *)malloc(6);//不可以在外部赋值一个6个char类型的内存
int main()
{
    strcpy(str, "ABCD");//字符  A B C D E '\0'  共6个
    printf("String = %s,  Address = %u\n", str, str);
    
}

正确写法

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

char  *str;

int main()
{
    str = (char *)malloc(6);//申请一个6个char类型的内存
    strcpy(str, "ABCD");//字符  A B C D E '\0'  共6个
    printf("String = %s,  Address = %u\n", str, str);
    
}

例3

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

int main()
{
    static char  *str = (char *)malloc(6);//不可以使用静态变量申请
    strcpy(str, "ABCD");//字符  A B C D E '\0'  共6个
    printf("String = %s,  Address = %u\n", str, str);
    
}

 

二、calloc函数

calloc函数分配内存的同时清空内存

函数原型   void *calloc(size_t nitems, size_t size)

nitems -- 要被分配的元素个数。

size -- 元素的大小。

calloc函数根据nitems和size 两个参数的成绩来分配内存,并返回一个指向内存的第一个字节的指针,如果不能分配内存,则返回一个NULL。

int *p calloc(5,sizeof(int))

内存需要清零可以使用calloc,不过执行calloc可能比执行malloc慢。

 

三、realloc函数

时不时地增加或减少指针分配的内存。

函数原型:void *realloc(void *ptr , size_t size);

realloc  函数返回指向内存块的指针,该函数接受两个参数,第一个参数指向原内存块的指针,第二个是请求的大小。重新分配的块大小和第一个参数引用的块大小不同。返回值是指向重新分配的内存的指针。

请求的内存大小,如果比当前分配的小,那么多余的内存会还给堆,不能保证多余的内存会被清空。

                                如果比当前分配的大,那么可能就在紧挨着当前分配内存的区域分配新的内存,否则就会在堆的其他区域分配                                 并把旧的内存赋值到新区域。

内存缩小

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char  *str2 ;
    char  *str1 ;
    str1 = (char *)malloc(10);
    strcpy(str1, "ABCD123");//字符  A B C D E '\0'  共6个
    printf("String = %s,  Address = %p\n", str1, str1);

    str2 =realloc(str1,2);
    printf("String = %s,  Address = %p\n", str2, str2);
    return(0);
}
//内存缩小

堆管理可以重用原始的内存块,且不会修改其内容。不过程序继续使用的内存超过请求的8字节,所以不会报错,但是很危险。

 

内存扩大

 

四、free函数

释放内存    void free(void *p)   ,释放之前有调用 calloc、malloc 或 realloc 所分配的内存空间,*p指针指向一个要释放内存的内存块。

int *p = (int*)malloc(sizeof(int));

...

free(*p)

 

1、不能重复释放同一块内存。

2、free函数应该在同一层管理内存的分配和释放。比如说如果在函数内分配内存,那么就要在同一个函数内释放它。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

malloc、calloc、realloc、free函数的使用 的相关文章

随机推荐

  • iOS代码混淆初探

    iOS代码混淆初探 在没有对应用的代码做过特殊处理的情况下 一般应用的代码中的类名和方法都是明文的 在逆向分析中 通过class dump获取MachO可执行文件中的所有类 定义的方法和属性 就能很快的从名字入手猜到这个方法是做什么用的 所
  • 如何查看MySQL的版本?

    原文地址 http blog csdn net lamp yang 3533 article details 52266320 查看MySQL的版本 主要有以下几个方法 1 没有连接到MySQL服务器 就想查看MySQL的版本 打开cmd
  • java并发包:fork/join

    本文转载至 http blog csdn net a910626 article details 51900967 Fork Join框架是Java7提供了的一个用于并行执行任务的框架 是一个把大任务分割成若干个小任务 最终汇总每个小任务结
  • vue+ts+element-plus 父组件调用子组件,子组件为el-dialog,无法弹出子组件?

    问题 使用vue ts element plus练习 在使用el dialog时遇到问题 问题1 是子组件为el dialog 父组件调用子组件弹出对话框 因为element plus中el dialog的v model无法赋值为props
  • 常用的idea快捷键及其使用说明如下:

    常用的idea快捷键及其使用说明如下 1 Ctrl N 打开一个新的文件 2 Ctrl S 保存当前文件 3 Ctrl Shift N 创建一个新的文件夹 4 Ctrl Shift S 另存为当前文件 5 Ctrl O 打开一个已存在的文件
  • java编译命令用什么写_要编译java程序需要使用的命令是什么

    要编译java程序需要使用的命令是什么 发布时间 2020 07 22 14 01 15 来源 亿速云 阅读 83 作者 Leah 要编译java程序需要使用的命令是什么 很多新手对此不是很清楚 为了帮助大家解决这个难题 下面小编将为大家详
  • Qt里通过传递函数指针实现动态绑定信号/槽

    test h include
  • 在VMware中给win10/win7虚拟机配置静态IP地址(保姆级教学,全是干货)

    1 点击VMware菜单栏的编辑 进入虚拟网络编辑器 2 点击更改设置 3 选择NAT模式 取消勾选 使用本地DHCP服务将IP地址分配给虚拟机 然后点击NAT设置 查看并记住网关IP 然后关闭NAT设置窗口 回到虚拟编辑器页面 点击确定
  • 51单片机 数码管中断操作

    实践目的 1 掌握中断的概念和思想 2 掌握51单片机中断系统和相关软硬件设计 实践内容 1 利用单片机的P0口接数码管的字段脚 P1 0脚接共阴极 P3 2 P3 3引脚接独立按键产生外部中断信号 编写程序 当程序正常运行时数码管显示H字
  • 如何保护您的数据免受.malox勒索病毒的威胁?

    简介 malox勒索病毒是2022年就开始出现的一种恶意软件 它以其强大的加密算法和恶意行为而闻名 91数据恢复将在本文深入探讨 malox勒索病毒的特征 以及被 malox勒索病毒加密的数据文件的恢复方法 帮助受害者了解如何应对这一威胁
  • vue3使用babel-plugin-import按需引入element-plus

    vue3使用babel plugin import按需引入element plus 2022年6月13日更新 用babel plugin import按需引入element plus会有问题 用官方推荐的方式真香了 以下是链接 https
  • Unity旋转以及万向锁问题

    我之前研读了一些关于unity旋转相关的博客 一直想抽个时间写个总结 但是由于实习太忙一直没有写 趁着今天请了假晚上有时间把这段时间一些学习心得写出来 Unity inspector面板中的Rotation 在unity中 想必大家最先接触
  • 如何在linux系统下创建空白文本.txt文件

    如何在linux系统下创建空白文本 txt文件 跳转到要新建文本的目录下 打开终端 输入命令 最后 跳转到要新建文本的目录下 可利用cd命令在终端跳转 或者直接到要新建文件的目录文件夹中 打开终端 输入命令 touch 文本名 txt 例如
  • MySQL之索引

    数据库中的索引与书的目录相似 表中的数据类似于书的内容 书的目录有助于读者快速地找到书中相关的内容 数据库的索引有助于加快数据检索速度 目前大部分MySQL索引都是以B 树 BTREE 方式存储的 BTREE方式构建了包含多个节点的一棵树
  • pyqt点击按钮执行脚本

    class NineGridApp QWidget def init self super init self initUI def initUI self self setWindowTitle 测试常见的操作 self setGeome
  • ClassUtils.getClassFileName()方法具有什么功能呢?

    转自 ClassUtils getClassFileName 方法的功能简介说明 下文笔者讲述ClassUtils getClassFileName方法的功能简介说明 如下所示 ClassUtils getClassFileName 方法的
  • 异或运算总结

    其实主要是想介绍一些关于异或的一些例题 方便自己的复习 目录 什么是异或运算 异或运算的性质 异或性质的应用 什么是异或运算 异或 xor 是一个数学运算符 它应用于逻辑运算 异或的数学符号为 计算机符号为 xor 其运算法则为 a b a
  • GPT系列训练与部署——GPT2环境配置与模型训练

    本文为博主原创文章 未经博主允许不得转载 本文为专栏 Python从零开始进行AIGC大模型训练与推理 系列文章 地址为 https blog csdn net suiyingy article details 130169592 Colo
  • APP INVENTOR调用HTTPClient

    APP INVENTOR调用HTTPClient APP中使用HTTPClient调用api 这里使用的是聚合数据提供的API 使用所有的API都是大同小异 参数的参数有所不同 我们这里使用post方式 传回的是json格式 在解析了以后
  • malloc、calloc、realloc、free函数的使用

    malloc realloc calloc free函数大部分在 stdlib h 文件中 malloc 函数 从堆上分配内存 calloc 函数 从堆上分配内存并清零 realloc 函数 在之前分配的内存块的基础上 将内存重新分配为更大