当前位置: 首页 > ops >正文

C-内存函数,动态内存

一、内存函数

==================================================================

1、void* memcpy(void* dest,const void* src,size_t num);内存copy函数。将src中的内容,copy num个字节到dest中;copy两块独立空间的数据。

void* memcpy(void* dest,const void* src,size_t num);
int src[] = {1,2,3,4,5,6};
int dest[10] = {0};
memcpy(dest,src,6*4);//将src中的数据复制到dest中

2、void* memmove(void* dest,const void* src,size_t num),copy两块有关联空间的数据

void* memmove(void* dest,const void* src,size_t num)
int dest[] = {1,2,3,4,5,6};
memcpy(dest+3,dest,3*4);//将dest中的123,复制到456,输出123123

3、int memcmp(const void* dest,const void* src,size_t num);内存比较num个字节的数据是否相等。

int memcmp(const void* dest,const void* src,size_t num);

返回值:dest< src,return <0;dest== src,return =0;dest> src,return >0;

4、void* memset(void* dest,int num,size_t size);内存设置,按字节为单位进行初始化

void* memset(void* dest,int num,size_t size);
/*
dest:需要设置内存的空间的起始地址
num:需要设置的元素,会先将参数转换成ascII码后再复制,可以传char类型
size:需设置的字节数
*/

二、动态内存

内存泄漏:申请了一篇空间,但是没有释放,导致这篇内存空间无法被其他对象试用也无法释放,浪费的这篇内存就是内存泄露。

1、动态内存函数

①、malloc:开辟指定字节个数的内存,并返回内存地址;申请失败返回NULL,maloc传参如果是传入0,可以忽略,表示未定义;

void* malloc(size_t size);

开辟40字节的空间,用来保存int类型的数据

#include <stdlib.h>
#include<string.h>
int main()
{int* p = (int*)malloc(40);if (p == NULL) {printf("%s\n", strerror(errno));return 1;}int i = 0;for (i = 0; i < 10; i++) {*(p + i) = i;}for (i = 0; i < 10; i++) {printf("%d ", *(p + i));}return 0;
}

②、free

malloc 申请,free释放,成对出现,避免内存泄漏,free只能释放动态参加的内存。

free(NULL):此时什么都不操作。

	//申请开辟空间int* p = (int*)malloc(40);//释放内存free(p);//free(p)虽然将申请的内存空间释放掉了,但是此时p是一个野指针,//依旧可以通过p找到这篇空间的地址,为了保证内存安全,将p置为NULL即可。p = NULL;

③、calloc

num:开辟元素的个数

size:每个元素的大小

calloc函数在开辟空间后,会将开辟的空间全都初始化为0后再返回。使用结束后,通过free函数释放空间。

void* calloc (size_t num,size_t size);

④、realloc

动态调整内存空间的大小

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

ptr:要修改空间的起始地址

size:将ptr指向的空间重置为size大小的新空间

realloc工作原理:

情况1:realloc(p,40);p指针后面连续的空间p+40个字节的空间是空闲的,那么就直接扩展40个字节后,返回p;即在连续空间上扩展

情况2:realloc(p,40);p指针后面没有连续的空闲空间,那么会在内存中查找空闲的40个字节大小的空间后,将原来内存空间的数据memcpy到新空间后,free原空间内存,返回新空间地址

情况3:realloc(p,INT_MAX);扩展的空间太大,那么会返回NULL;因此realloc会出现扩容失败的场景,所以在接受realloc返回值时,不应该使用原空间地址直接接收,应该先判断扩展后返回的指针是否为NULL,避免返回指针为NULL接收导致原数据丢失。

2、常见的动态内存错误

①、对NULL指针的解引用操作

②、对动态开辟的内存空间越界访问

③、对非动态开辟空间的内存进行free

④、使用free释放动态开辟内存的一部分

⑤、对同一块空间多次释放

⑥、动态内存开辟忘记释放(内存泄漏)

http://www.xdnf.cn/news/9240.html

相关文章:

  • Qt布局连续添加控件
  • Web3怎么本地测试连接以太坊?
  • 封装文档核心知识点总结(通俗版)
  • 利用 MkDocs 和 GitHub 部署个人博客网页
  • LINUX安装运行jeelowcode后端项目(命令行)
  • 【运维自动化-标准运维】如何实现在不同步骤间传递参数
  • 人该怎样活着呢?54
  • 随机模拟专题:第一课
  • 5G网络切片技术:开启网络服务定制化新时代
  • SpringMVC注解、@Controller注解和@RestController注解的区别、@RequestMapper、@PathVariable
  • 制作一款打飞机游戏59:子弹生成
  • DeepSeek 赋能智能安防:从算法革新到场景落地的全解析
  • 4月报 | SeaTunnel支持TDengine的多表Sink功能
  • 机器学习算法-- K 近邻算法(KNN)
  • Linux 资源限制(进程级,用户级,系统级)
  • Debian 11 之使用hostapd与dnsmasq进行AP设置
  • 欧拉定理:若 gcd(a,n)=1,则 a^φ(n)≡1(mod n)。
  • 2025 吉林CCPC
  • 【数据结构】 时间复杂度
  • 浙大版《Python 程序设计》题目集6-3,6-4,6-5,6-6列表或元组的数字元素求和及其变式(递归解法)
  • 前端生成UUID
  • 5.27 打卡
  • 哪些技术要素决定了多媒体数字沙盘的呈现效果与用户体验?
  • Cursor 与DeepSeek的完美契合
  • 树莓派超全系列教程文档--(49)远程访问树莓派
  • 5.27 day 30
  • SQL计算列
  • 数据要素配置如何驱动城市经济韧性的多元模式
  • 【leetcode】209. 长度最小的子数组
  • LeetCode 高频 SQL 50 题(基础版)之 【连接】部分 · 上