动态内存;

目录

1.malloc;

简要介绍:

如何使用:

free函数:

2.calloc;

简要介绍:

与malloc的区别:

3.realloc;

简要介绍:

如何使用:

4.动态内存常见错误;


1.malloc;

简要介绍:

void* malloc (size_t size);
这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。

如果开辟成功,则返回一个指向开辟好空间的指针。

如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。

返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。

如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。

如何使用:

代码:
#include <stdio.h>
int main()
{int num = 0;scanf("%d", &num);int arr[num] = { 0 };int* ptr = NULL;ptr = (int*)malloc(num * sizeof(int));if (NULL != ptr){int i = 0;for (i = 0; i < num; i++){*(ptr + i) = 0;}}free(ptr);ptr = NULL;return 0;
}

代码分析:

输入数组元素的个数。创建一个空指针,使用malloc创建所需要的空间,并将void*类型的指针强制转换成int*型;创建完成,判断创建是否成功,如果成功,给其赋值,释放空间,赋为空指针;如果创建不成功,直接释放,赋为空指针;

free函数:

C语言提供了另外一个函数free,专门是用来做动态内存的释放和回收的,函数原型如下:
free函数用来释放动态开辟的内存。
如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。
如果参数 ptr 是NULL指针,则函数什么事都不做。

2.calloc;

简要介绍:

void* calloc (size_t num, size_t size);
函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0。

与malloc的区别:

与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。

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

运行结果:

3.realloc;

简要介绍:

void* realloc (void* ptr, size_t size);
ptr 是要调整的内存地址
size 调整之后新大小
返回值为调整之后的内存起始位置。
这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到 新 的空间。

如何使用:

代码:
#include <stdio.h>
int main()
{int *ptr = (int*)malloc(100);if(ptr != NULL){}else{exit(EXIT_FAILURE);    }//扩展容量ptr = (int*)realloc(ptr, 1000);//这样可以吗?(如果申请失败会如何?)//代码2int*p = NULL;p = realloc(ptr, 1000);if(p != NULL){ptr = p;}//业务处理free(ptr);return 0;
}

代码分析:

使用malloc创建空间,返回空间的地址,并对其进行判断;再使用realloc进行扩容,返回地址;这里的地址有两种情况:情况1:原有空间之后有足够大的空间 ,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化;情况2:后面没有足够空间,会重新找个位置开辟80个字节,把旧空间的内容拷贝到新空间,把原来的空间释放;返回新地址;

4.动态内存常见错误;

代码1:

void test()
{int *p = (int *)malloc(INT_MAX/4);*p = 20;free(p);
}

代码1分析:

这里没有判断p是不是空指针就解引用;

代码2:

void test()
{int i = 0;int *p = (int *)malloc(10*sizeof(int));if(NULL == p){exit(EXIT_FAILURE);}for(i=0; i<=10; i++){*(p+i) = i;}free(p);
}

代码2分析:

当i是10的时候越界访问;

代码3:

void test()
{int a = 10;int *p = &a;free(p);
}

代码3分析:

a申请的空间不是动态内存,不可以使用free释放;

代码4:

void test()
{int *p = (int *)malloc(100);p++;free(p);
}

代码4分析:

p++后指向的不是原来的整块动态空间,是部分的动态空间;

代码5:

void test()
{int *p = (int *)malloc(100);free(p);free(p);

代码5分析:

重复释放p;

代码6:

void test()
{int *p = (int *)malloc(100);if(NULL != p){*p = 20;}
}
int main()
{test();while(1);
}

代码6分析:

开辟的动态内存忘记free;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/615138.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Eureka-搭建Eureka步骤

简介&#xff1a; Eureka是Netflix开发的服务发现框架&#xff0c;本身是一个基于REST的服务&#xff0c;主要用于定位运行在AWS域中的中间层服务&#xff0c;以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中&#xff0c;以实…

【随身wifi京东金榜排名】格行vs华为vs上赞随身wifi哪款最好用?格行随身wifi官方正品,格行随身wifi怎么样?

第一名&#xff1a;格行随身wifi 综合分99.1 随身WiFi行业领跑品牌 &#xff0c;15年行业经验 &#xff0c;随身WiFi口碑榜第一名。轻便小巧&#xff0c;支持三网通&#xff0c;可以随时随地提供稳定高速的网络连接。使用目前先进的马维尔芯片&#xff0c;信号稳定&#xff0…

HashMap源码剖析

1.JDK7版本创建与添加数据的的过程 (1). HashMap<String, Integer> map &#xff1d;new HashMap<>(); //创建对象过程中&#xff0c;底层会初始化数组Entry[] table &#xff1d;new Object[16];16是2的倍数. ... map.put("hexua", 66); 将"h…

Java springmvc 参数名用is开头导致为null

因为最近在整理一些源码和编写规范&#xff0c;这里写一下只是记录几年前自己遇到的问题&#xff0c;好久都忘了&#xff0c;还是写下来比较好。 问题记录&#xff1a;由于变量使用了boolean&#xff0c;并且变量名是is开头的&#xff0c;由于java机制boolean默认是false&#…

变量---

一、变量概述 1、什么是变量 变量是用于存放数据的容器。通过变量名 获取数据&#xff0c;甚至数据可以修改。 变量的本质&#xff1a;变量是程序在内存中申请的一块用来存放数据的空间。 二、变量的使用 变量在使用时分两步&#xff1a;1、声明变量 2、赋值 三、变量语法…

【回溯】Leetcode 51. N 皇后【困难】

N 皇后 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案。…

2024年第十四届MathorCup数学应用挑战赛B题解题思路

B题https://mbd.pub/o/bread/ZZ6Wm5dx 问题1:对于附件I(Pre_test文件夹)给定的三张甲骨文原始拓片图 片进行图像预处理&#xff0c;提取图像特征&#xff0c;建立甲骨文图像预处理模型&#xff0c;实现对 甲骨文图像干扰元素的初步判别和处理。 针对问题1&#xff0c;对于附件…

vue源码解析——v-if和v-for哪个优先级高,如何避免两者同时使用

首先&#xff0c;官方不推荐v-if和v-for在同一个元素上使用。其次&#xff0c;如果两者同时使用&#xff0c;v-if和v-for的优先级怎么确定&#xff1f;在vue2和vue3中这两者的优先级顺序不一样。vue2是v-for优先&#xff0c;条件不存在时也会渲染多个注释节点。在vue3中进行了改…

Android - 安卓概述

什么是安卓? Android 是一种基于 Linux 的开源操作系统&#xff0c;适用于智能手机和平板电脑等移动设备。 Android 是由 Google 和其他公司领导的 Open Handset Alliance 开发的。 Android 为移动设备的应用程序开发提供了统一的方法&#xff0c;这意味着开发人员只需为 And…

多模块项目使用springboot框架进行业务处理

项目目录 1、在Result定义返回结果 package com.edu.result;import lombok.Data;import java.io.Serializable;/*** 后端统一返回结果* param <T>*/ Data public class Result<T> implements Serializable {private Integer code; //编码&#xff1a;1成功&#xf…

聚酰亚胺PI材料难于粘接,用什么胶水粘接?那么让我们先一步步的从认识它开始(二十五): 聚酰亚胺光敏PI(PSPI)

聚酰亚胺光敏PI&#xff08;PSPI&#xff09; 聚酰亚胺光敏PI&#xff08;PSPI&#xff09;是一种结合了聚酰亚胺&#xff08;PI&#xff09;的优良物理和化学性能以及光敏材料特性的高端有机材料。在高分子链上&#xff0c;它兼有亚胺环和光敏基因&#xff0c;因此具有优异的热…

蓝桥杯 前一晚总结 模板 新手版

《准备实足&#xff0c;冲冲冲 省一》https://www.yuque.com/lenyan-svokd/hi7hp2/hfka297matrtsxy2?singleDoc# 《准备实足&#xff0c;冲冲冲 省一》 #include<bits/stdc.h> // 包含标准库头文件using namespace std; using ll long long; // 定义 long long 数据类…