C语言内存函数精讲

目录

引言

1.内存分配函数malloc

2.内存释放函数free

3.内存拷贝函数memcpy

4.内存移动函数memmove

5.内存设置函数memset

6.内存比较函数memcmp

总结 


引言

在C语言编程中,内存管理是核心技能之一。C语言提供了一系列内存操作函数,这些函数在动态内存分配、数据拷贝和比较等方面发挥着重要作用。本文将详细介绍这些内存函数的用法和注意事项。

1.内存分配函数malloc

malloc用于动态分配指定大小的内存空间。原型如下:

void *malloc(size_t size);

size:需要分配的内存字节数。
返回值:成功时返回指向分配内存的指针,失败时返回NULL。

使用示例:

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main() {int* array = (int*)malloc(sizeof(int) * 10);if (array == NULL) {printf("Memory allocation failed!\n");return -1;}// 使用分配的内存for (int i = 0; i < 10; i++) {array[i] = i;}free(array); // 释放内存return 0;
}

2.内存释放函数free

free用于释放动态分配的内存空间。原型如下:

void free(void *ptr);

ptr:指向需要释放的内存空间。

使用示例同上。

3.内存拷贝函数memcpy

memcpy用于将一块内存内容拷贝到另一块内存。从功能上看可以取代strcpy函数。原型如下:

void *memcpy(void *dest, const void *src, size_t n);

dest:目标内存地址。
src:源内存地址。
n:需要拷贝的字节数。
返回值:成功时返回指向目标内存的指针。

使用示例:

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0 };memcpy(arr2, arr1, 40);//将arr1数组内容复制到arr2int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}

运行结果:

4.内存移动函数memmove

memmove用于将一块内存内容移动到另一块内存,即使源内存和目标内存有重叠也能正确执行。和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。 原型如下:

void *memmove(void *dest, const void *src, size_t n);

dest:目标内存地址。
src:源内存地址。
n:需要移动的字节数。
返回值:成功时返回指向目标内存的指针。

使用示例: 

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };memmove(arr1 + 2, arr1, 20);//将从下标0处开始的5个整形数据移动到下标2开始的位置int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}

运行结果:

5.内存设置函数memset

memset用于将一块内存设置为一个指定的值。原型如下:

void *memset(void *s, int ch, size_t n);

s:需要设置的内存地址。
ch:需要设置的值。
n:需要设置的内存字节数。
返回值:成功时返回指向目标内存的指针。 

 使用示例:

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{char str[] = "hello world";memset(str, 'x', 6);//将前面6个字符设置为xprintf(str);return 0;
} 

运行结果:

6.内存比较函数memcmp

memcmp用于比较两块内存内容的前n个字节。原型如下:

int memcmp(const void *s1, const void *s2, size_t n);

s1:第一块内存地址。
s2:第二块内存地址。
n:需要比较的字节数。
返回值:小于0、等于0或大于0,取决于比较结果。

 使用示例:

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{char buffer1[] = "DWgaOtP12df0";char buffer2[] = "DWGAOTP12DF0";int n;n = memcmp(buffer1, buffer2, sizeof(buffer1));if (n > 0)printf("'%s' is greater than '%s'.\n", buffer1, buffer2);else if (n < 0)printf("'%s' is less than '%s'.\n", buffer1, buffer2);elseprintf("'%s' is the same as '%s'.\n", buffer1, buffer2);return 0;
}

 运行结果:

总结 

本文介绍了C语言中的内存操作函数,包括内存分配(malloc)、内存释放(free)、内存拷贝(memcpy)、内存移动(memmove)、内存设置(memset)以及内存比较(memcmp)。掌握这些函数,可以让C语言程序员更加高效地处理内存相关的任务。在使用这些函数时,需要注意内存泄漏、内存越界和内存重叠等问题,以确保程序的安全性和稳定性。

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

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

相关文章

把Hexo博客迁移到新电脑

原文&#xff1a;https://blog.c12th.cn/archives/31.html 前言 把博客迁移到新电脑&#xff0c;以前推 Github 仓库不用配Key也能推&#xff0c;现在需要配Key了… 准备工作 确保在新电脑上配置好 Node.js 的环境 安装hexo npm install hexo-cli -g安装插件 npm install …

nmcli修改连接名 笔记240725

nmcli修改连接名 nmcli connection modify 原名 con-name 新名nmcli connection modify UUID con-name 新名通过网络名或uuid删除连接 nmcli connection delete 连接名或uuid通过设备名删除连接 nmcli device disconnect 设备连接用 nmcli device connect 设备名 创建的连接…

在android中怎么处理后端返回列表中包含图片id,如何将列表中的图片id转化成url

在 Android 中实现从包含图片 ID 的列表获取实际图片 URL 并显示图片,你可以使用以下步骤: 定义数据模型:创建一个 Java 或 Kotlin 类来表示列表中的对象。 网络请求:使用 Retrofit 或其他网络库来获取图片 URL。 异步处理:使用 AsyncTask、RxJava 或 Kotlin 协程来处理网…

算法训练 2024.7.27 17:25

目录 1. 两数之和2.反转链表3. 是否为有效的括号4.最长公共前缀5.合并两个有序数组6. 岛屿的个数7. 最小路径和8. 三数之和9. 计数质数10. 字符串转换整数 ( atoi) 1. 两数之和 题目&#xff1a; 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为…

Python 在自动化中的实际应用:用 Python 简化繁琐任务

文章目录 1、概述2、自动化文件和目录管理3.数据处理与分析4.网页爬虫5. 系统管理6。定时任务7.结语 1、概述 这篇文章将深入探讨Python在自动化中的实际应用&#xff0c;帮助您用Python简化繁琐任务。 我们将从多个方面入手&#xff0c;展示如何利用Python进行文件管理、数据…

百度贴吧爬虫实战(BeautifulSoup+lxml)

文章目录 BeautifulSouplxml使用场景具体代码具体解析1. 导入模块2. 定义爬虫类3. 初始化方法4. 获取URL列表5. 获取页面内容6. 提取页面数据7. 保存数据8. 运行爬虫9. 主程序 总结 在实际爬虫之前还需要了解和下载两个模块&#xff1a;BeautifulSoup和lxml。 BeautifulSoup 和…

jmeter-beanshell学习-try处理异常

有时候代码执行过程中&#xff0c;出现一些不能处理的情况&#xff0c;就会报错&#xff0c;还影响之后的代码执行&#xff0c;就需要跳过异常。 上面这情况报错了&#xff0c;还影响了下面的打印。beanshell用try和catch处理异常&#xff0c;下面是try的用法&#xff0c;和if有…

PHP哈希签名方式sha1和sha256用于API对接签名验证

sha1 &#xff08;长度40字节&#xff09; -------------------------------------------------------------- $str 203fpid; $sha1 sha1($str); echo $sha1.<br>; php sha256加密 &#xff08;长度64&#xff09; --------------------------------…

技术守护尊严||Chat GPT在抵抗性骚扰的作用分析

就在本周&#xff0c;中国人民大学女博士实名举报导师性骚扰的事情&#xff0c;引发全网关注&#xff01; 性骚扰&#xff0c;无论在线上还是线下&#xff0c;无论在职场还是校园&#xff0c;都是对个人尊严与权益的严重侵犯。 幸运的是&#xff0c;随着人工智能技术的飞速发…

优化冗余代码:提升前端项目开发效率的实用方法

目录 前言代码复用与组件化模块化开发与代码分割工具辅助与自动化结束语 前言 在前端开发中&#xff0c;我们常常会遇到代码冗余的问题&#xff0c;这不仅增加了代码量&#xff0c;还影响了项目的可维护性和开发效率。还有就是有时候会接到紧急业务需求&#xff0c;要求立马完…

[网络通信原理]——TCP/IP模型—网络层

网络层 网络层概述 网络层位于OSI模型的第三层&#xff0c;它定义网络设备的逻辑地址&#xff0c;也就是我们说的IP地址&#xff0c;能够在不同的网段之间选择最佳数据转发路径。在网络层中有许多协议&#xff0c;其中主要的协议是IP协议。 IP数据包格式 IP数据报是可变长度…

区块链——代码格式检查(prettier、solhint)

一、引入依赖 // 导入prettier prettier-plugin-solidity yarn add --dev prettier prettier-plugin-solidity yarn add --dev solhint二、创建.prettierrc文件 {"tabWidth": 2,"semi": false,"useTabs": false,"singleQuote": fals…

《最新出炉》系列入门篇-Python+Playwright自动化测试-55- 上传文件 (非input控件)- 中篇

软件测试微信群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 在实际工作中&#xff0c;我们进行web自动化的时候&#xff0c;文件上传是很常见的操作&#xff0c;例如上传用户头像&#xff0c;上传身份证信息等。所以宏哥打算按上传文件…

100个Python基本语法知识(一)

1. 基本语法结构 缩进 Python使用缩进来定义代码块&#xff0c;而不是像其他语言那样使用大括号{}。通常&#xff0c;每个缩进级别使用4个空格。 注释 单行注释以#开头。多行注释可以使用三引号或"""。 变量 Python是动态类型语言&#xff0c;变量无需事先…

模块与组件、模块化与组件化的理解

在React或其他现代JavaScript框架中&#xff0c;模块与组件、模块化与组件化是核心概念&#xff0c;它们对于提高代码的可维护性、复用性和开发效率具有重要意义。以下是对这些概念的理解&#xff1a; 模块与组件 模块&#xff08;Module&#xff09; 定义&#xff1a;模块是…

Java从入门到精通(十二)~ 动态代理

晚上好&#xff0c;愿这深深的夜色给你带来安宁&#xff0c;让温馨的夜晚抚平你一天的疲惫&#xff0c;美好的梦想在这个寂静的夜晚悄悄成长。 文章目录 目录 前言 主要作用和功能&#xff1a; 应用场景&#xff1a; 二、代理概念 1.静态代理 2.动态代理 2.1 概念介绍 …

网址导航系统PHP源码分享

1、采用光年全新v5模板开发后台 2、后台内置8款主题色&#xff0c;分别是简约白、炫光绿、渐变紫、活力橙、少女粉、少女紫、科幻蓝、护眼黑 3、可管理无数引导页主题并且主题内可以进行不同的自定义设置&#xff0c;目前内置16套主题 持续增加中… 4、可单独开发各种插件&a…

OSPF Type2 Message / DBD Packet (Database Descriptor)

注&#xff1a;机翻&#xff0c;未校对。 OSPF Type2 Message / DBD Packet (Database Descriptor) DBD (Database Description or Type2 OSPF Packet) is a sort of summary of the OSPF Database in a router. DBD is used to check if the LSDB between 2 routers is the s…

Linux---make/makefile工具

目录 基本了解 makefile基础语法 依赖关系 依赖方法 makefile文件内容格式 make执行机制 补充知识 机制解释 PHONY关键字 makefile补充语法 基本了解 在Linux中&#xff0c;make/makefile是项目自动化构建工具。如果我们没有make/makefile&#xff0c;那我们要编译一…

基于Java的模拟写字板的设计与实现

点击下载链接 基于Java的模拟写字板的设计与实现 摘要&#xff1a;目前&#xff0c;很多新的技术领域都涉及到了Java语言&#xff0c;Java语言是面向对象编程&#xff0c;并且涉及到网络、多线程等重要的基础知识&#xff0c;因此Java语言也是学习面向对象编程和网络编程的首…