【C语言】标准库中常用内存操作函数大全(memcpy memset)

Unity Android构建报错:compileSdk 35兼容性五层定位法 Android构建中的compileSdk是编译时API目标版本,其升级并非孤立操作,而是触发JDK、Android Gradle Plugin(AGP)、NDK、targetSdk与Unity引擎版本之间强耦合校验的起点。当出现'using a newer Android Gradle plugin to use compileSdk = 35'类报错,本质是代际技术栈错配——例如AGP 7.1.3不识别compileSdk 35所需Java 17语法,或NDK 21与AGP 7.4的ABI规范冲突。该问 阅读详情

以下是 C 标准库中常用的 内存操作函数 的详细说明,
这些函数定义在头文件 <string.h> 中。


1. memcpy

原型:

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

功能:

将 src 所指向的内存区域的前 n 个字节复制到 dest 所指向的内存区域。
⚠️ 注意:不能用于重叠内存区域(使用 memmove 替代)。

参数:

  • dest:目标内存地址。
  • src:源内存地址。
  • n:要复制的字节数。

返回值:

返回指向 dest 的指针。
memcpy 函数不能用于重叠的内存区域的原因主要在于其底层实现机制。为了更好地理解这个问题,我们需要了解 memcpy 是如何工作的。

memcpy 的工作原理

memcpy 函数通常按照从低地址到高地址的方向进行复制操作。这意味着它会从源内存块 (src) 的起始位置开始读取数据,并将这些数据写入目标内存块 (dest) 的起始位置,然后逐步向后移动指针直到完成指定字节数 (n) 的复制。

如果源和目标内存区域存在重叠,目标地址在源地址之后(目标地址 > 源地址),那么在复制过程中,还未被复制的数据可能会被覆盖,从而导致数据丢失或复制结果不正确。

示例:

#include <stdio.h>
#include <string.h>

int main() {
    char src[] = "Hello World";
    char dest[20];

    memcpy(dest, src, strlen(src) + 1); // 包括 '\0'
    printf("dest: %s\n", dest);

	memcpy(src + 2, src, 10); // 不符合预期
    return 0;
}

2. memmove

原型:

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

功能:

与 memcpy 相同,但可以安全地处理重叠内存区域。
它会根据源和目标地址的关系选择适当的复制方向(从前向后或从后向前),从而避免数据丢失。


3. memset

原型:

void *memset(void *str, int c, size_t n);

功能:

将 str 指向的内存块的前 n 个字节设置为值 c(按字节设置)。

参数:

  • str:要填充的内存地址。
  • c:要设置的值(以 int 形式传入,实际使用其低8位)。
  • n:要设置的字节数。

返回值:

返回指向 str 的指针。

示例:

#include <stdio.h>
#include <string.h>

int main() {
    char buffer[20];
    memset(buffer, 'A', 10); // 前10个字节设为 'A'
    buffer[10] = '\0';       // 手动添加终止符
    printf("buffer: %s\n", buffer);

    return 0;
}

4. memcmp

原型:

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

功能:

比较两个内存块的前 n 个字节内容。

参数:

  • s1, s2:要比较的两个内存块。
  • n:要比较的字节数。

返回值:

  • 小于 0:如果 s1 小于 s2
  • 等于 0:如果 s1 等于 s2
  • 大于 0:如果 s1 大于 s2

示例:

#include <stdio.h>
#include <string.h>

int main() {
    char a[] = "abcde";
    char b[] = "abXde";

    int result = memcmp(a, b, 5);
    if (result < 0)
        printf("a is less than b\n");
    else if (result == 0)
        printf("a equals b\n");
    else
        printf("a is greater than b\n");

    return 0;
}

5. memchr

原型:

void *memchr(const void *str, int c, size_t n);

功能:

在内存块 str 的前 n 个字节中查找字符 c(作为无符号字符)第一次出现的位置。

参数:

  • str:要搜索的内存块。
  • c:要查找的字符(以 int 形式传入)。
  • n:要检查的最大字节数。

返回值:

  • 成功:返回指向找到字符的指针。
  • 失败:返回 NULL。

示例:

#include <stdio.h>
#include <string.h>

int main() {
    char data[] = "This is a sample string.";
    char *found = memchr(data, 's', strlen(data));
    if (found)
        printf("Found 's' at position: %ld\n", found - data);

    return 0;
}

CloudCompare 二次开发(17)——点云添加均匀分布的随机噪声 使用CloudCompare编程实现点云添加随机噪声。 阅读详情

相关推荐

rk3566-11.0新增device分区

1.增加块设备 2.修改根目录节点权限 3.开机启动自动挂载 增加块设备 1.修改parameter.txt文件,新增块设备大小及命名 device/rockchip/rk356x/rk3566_r/parameter.txt FIRMWARE_VER: 11.0 MACHINE_MODEL: rk3566_r MACHINE_ID: 007 MANUFACTURER: rockchip MAGIC: 0x5041524B ATAG: 0x00200800 MACHINE

weixin_51115260的博客 3382

内存操作函数

memcpy是内存操作函数,所在的头文件是#include<string.h>。

2301_80028974的博客 3485

【C++ 使用libxlsxwriter库向excel表格中插入图片 CMake + VS2019】

使用libxlsxwriter向excel表格插入图片

恒星游历者的博客 753

内存函数的介绍

内存函数:memcpy、memmove、memcmp、memset

m0_68814541的博客 5671

域自适应的理解与想法(Domain Adaptation)

这幅图是域适应非常有名的一篇论文中的插图,被很多文章转载。 什么是领域自适应? Domain Adaptation是迁移学习中很重要的一部分内容,目的是把分布不同的源域和目标域的数据,映射到一个特征空间中,使其在该空间中的距离尽可能近。于是在特征空间中对source domain训练的目标函数,就可以迁移到target domain上,提高target domain上的准确率。 上面的图主要的思想来源于GAN,上图由三部分组成:特征映射网络 标签分类网络和和域判别网络 其中,source domain的数.

yuanxue18的博客 5981

【YOLO 系列】基于YOLO V8的智能车载交通标志识别系统【python源码+Pyqt5界面+数据集+训练代码】

本文详细介绍了基于YOLO V8构建智能车载交通标志识别系统的完整流程。从环境搭建、数据集准备、模型训练到PyQt5图形界面开发,提供了Python源码和实战代码,帮助开发者快速实现高精度、实时的交通标志检测应用,提升驾驶辅助系统的开发效率。

wdx012345的博客 966

memcpy 函数

最简单的实现就是使用循环逐字节地复制内存。这种方式对于小型的数据块效果很好,但效率相对较低。可能需要先处理头部和尾部未对齐的字节,确保中间的复制过程是对齐的,以利用硬件指令的优势。直接操作内存地址,通过指针的方式访问源和目标内存地址。是 C 标准库中的一个函数,用于。以下是一个简单的逐字节复制版本的。类型的指针进行字节级别的复制。为了更高效,很多标准库的。: 对于未对齐的数据,

weixin_47151388的博客 2343

Pyside6实战:3种.ui文件加载方式对比(附完整代码示例)

本文深入解析Pyside6中3种.ui文件加载方式的优劣与性能优化策略,包括动态加载QUiLoader、预编译方案及混合策略。通过实测数据和完整代码示例,帮助开发者根据项目需求选择最优解,提升界面加载效率与内存管理。

weixin_30897233的博客 88

memcpy操作和查看内存

dest:目标地址,即复制内容的目的地。src:源地址,即复制内容的来源。n:要复制的字节数。mem_store函数的作用是将指定的数据写入到内存的特定位置,类似于实际计算机中的存储操作。它还将写入操作记录到日志中,以便在程序运行时跟踪和调试内存的写入活动。

Never Give Up 1682

从零到一:用STM32 FOC算法驯服无刷电机的艺术

本文详细介绍了如何使用STM32和FOC算法实现无刷电机的高性能控制。从硬件搭建、参数识别到闭环调节,一步步解析FOC算法的核心原理与调优技巧,帮助开发者掌握电机控制的关键技术,实现从零到一的精准驯服。

kkk56的博客 916

SiC MOSFET驱动设计实战:从特性解析到电路优化

本文深入解析SiC MOSFET的核心特性及其驱动电路设计要点,涵盖高温稳定性、快速开关能力等关键特性,并提供驱动电压配置、电流能力计算、布局优化等实用方案。特别针对第三代电力电子半导体SiC MOSFET的驱动要求,分享STGAP1AS等典型驱动方案的应用技巧,助力工程师解决高频应用中的EMI和热管理挑战。

weixin_29230865的博客 365

C语言:memcpy的用法

memcpy是memory copy的缩写,意为内存复制,在写C语言程序的时候,我们常常会用到它。它的函原型如下: void *memcpy(void *dest, const void *src, size_t n); 功能是从src的开始位置拷贝n个字节的数据到dest。如果dest存在数据,将会被覆盖。memcpy函数的返回值是dest的指针。memcpy函数定义在string.h头文件里。 1.将一个字符串数据复制到一块内存。 memcpyTest1.c #include <st

qq_40378795的博客 1万+

基于Python的军事装备数据爬取与分析:从网页抓取到数据可视化实战

本文将详细介绍如何使用Python最新技术栈构建一个完整的军事装备数据爬虫系统。我们将从爬虫基础讲起,逐步深入到异步爬取、反反爬策略、数据存储与分析等高级主题,最终实现一个能够自动抓取、清洗、存储和分析军事装备数据的完整解决方案。文章包含大量实战代码示例,涉及requests-html、aiohttp、Playwright等现代爬虫库,以及MongoDB存储、Pandas分析和Pyecharts可视化等技术。关键词:Python爬虫、军事数据、异步爬取、反反爬、数据可视化。

2201_76125261的博客 1188

C语言零基础教程(memset,memcpy函数,memmove函数)

本篇文章来讲解一下memset和memcpy函数,这两个函数在C语言中也是比较重要的,这里我们就来学习一下这两个函数的使用方法吧。本篇文章就讲解到这里,大家看完后可以进行实验验证。

m0_49476241的博客 2万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【C语言内存函数完全指南】:memcpy、memmove、memset、memcmp 的用法、区别与模拟实现(含代码示例)

本文深入解析C语言四大内存函数:memcpy、memmove、memset和memcmp。通过图解和代码示例,详细讲解各函数的功能特性和使用场景:memcpy实现高效内存拷贝但不处理重叠区域;memmove智能处理内存重叠;memset用于内存初始化;memcmp比较内存内容。文章还提供了模拟实现代码,帮助开发者深入理解底层原理。特别强调memcpy与memmove的关键区别,并给出内存重叠问题的解决方案,是提升C语言内存管理能力的实用指南。

小韩的博客 2848

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C语言内存操作函数

比如对于内存的复制,内存的设置以及内存的比较,这些函数都是针对内存块来处理的,为程序员提供了更加安全,高效和灵活的方式,让程序员能够对内存进行各种常见的操作和处理,下面就让我们来详细了解一下吧。但是可能细心的同学会发现,我们就算使用memcpy函数也能够实现重叠部分的程序运算,但是我们在C语言中更推荐规范使用,如果有重叠部分的就使用memmove函数,虽然我们在VS的编译器上用memcpy来处理重叠部分可以成功,但是在其他编译器上却不一定,所以我们尽量的规范使用。memmove函数可以处理重叠部分。

OKkankan的博客 3610

深入理解 C 语言内存操作函数:memcpy、memmove、memset、memcmp

本文系统讲解了C语言四大内存操作函数:memcpy(基础内存拷贝)、memmove(支持重叠的安全拷贝)、memset(内存批量初始化)和memcmp(内存字节级比较)。文章详细分析了每个函数的原型、核心特性、使用示例和模拟实现,重点区分了memcpy和memmove在处理内存重叠时的差异,并强调了memset对int类型使用时需注意字节覆盖问题。通过对比表格总结了四大函数的功能差异和使用场景,为C语言开发者提供了内存操作的完整指南,帮助提升编程效率和代码安全性。

2502_91954313的博客 802

C语言内存函数

上期我们学习了字符函数以及字符串函数,但是字符串函数仅仅只能对字符进行操作,那么这次我们来学习一下内存函数在C语言中内存函数是一组用于内存操作的标准库函数,它们定义在 <string.h>头文件中,这些函数用于复制、设置、比较内存区域等,接下来我们来学习一下C语言中常用的内存函数。那么以上就是C语言中常用的内存函数,学完内存函数后,对于复制、设置、比较等操作就不仅仅只局限在字符中了,也可以对任意类型的数据进行复制、设置、比较等操作。

技术不止是工具,也是探索世界的方式 2546

深入探究 C 语言内存函数:memcpy、memmove、memset 和 memcmp

memcpymemmovememset和memcmp这四个内存函数在 C 语言编程中各有其独特的用途。memcpy适用于简单的非重叠内存复制,memmove则是处理重叠内存复制的首选,memset能高效地初始化内存区域,memcmp可用于比较内存内容。熟练掌握这些函数,能让我们在处理内存数据时更加得心应手,编写出高效、稳定的 C 语言程序。

2501_90200491的博客 1713

来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp

这里很明显即使我们调用memmove函数时传过去的指针地址是明显有重叠部分的,但是这里我们看见结果确实是没问题的,将arr的前20个字节即5个元素复制到arr+2往后的元素。这里面强制转化为char*的指针是因为让指针dst和src都是一个一个字节的往后访问。这里面强制转化为char*的指针是因为让指针dst和src都是一个一个字节的往后访问。memcmp是一个用于比较内存区域的函数。函数较为简单就不多加解释了。

2302_81249757的博客 1542

内存函数:memcpy()memmove()memcpy()memset()memcmp()

是C标准库中的一个函数,用于将指定内存区域的一块字节数据设置为特定的值。是C标准库中的一个函数,用于比较两个内存区域的内容。该函数会按字节比较两个内存区域的内容,直到发现不同的字节或比较完所有字节为止。可以看到在内存中,当列为4时,arr的07就是一个字节,第17个字节arr1是05, arr2是07。memcmp函数与strcmp函数类似,但memcmp函数的比较是一个字节一个字节的比较。两者都是内存拷贝函数,但memcpy处理的是不同空间的内容,即目标空间与源空间不同。

bkmoo的博客 2698

【C语言】C语言内存函数入门:一篇博客搞懂memcpy、memmove、memset、memcmp

本文介绍了C语言中四个重要内存操作函数的使用和实现:1. memcpy函数:实现内存块拷贝,不处理内存重叠情况,需注意参数类型转换和字节操作。2. memmove函数:功能类似memcpy但能处理内存重叠,提供了两种模拟实现方法(前向/后向拷贝)。3. memset函数:用于设置内存块内容,以字节为单位,常用于初始化或清零操作。4. memcmp函数:比较两块内存内容,可指定比较长度,返回比较结果。文章通过代码示例详细演示了各函数的使用方法和注意事项,并给出了memcpy和memmove的模拟实现代码。

小年糕的博客 1004

36 C 语言内存操作函数详解:memset、memcpy、memccpy、memmove、memcmp、memchr

本文深入解析了 C 语言中的六个关键内存操作函数:memset、memcpy、memccpy、memmove、memcmp、memchr。详细阐述了它们的功能、参数、返回值及应用场景,通过示例代码展示了使用方法。文章还总结了这些函数的注意事项,为开发者提供了全面的内存操作指南。

大模型全栈工程师 · Thanks_ks 2077

内存函数中的拷贝、填充和比较函数(memcpy、memmove、memset、memcmp)

前面我们学习了字符函数(tolower等)和字符串函数(strcpy、strcmp等),我们可以发现字符串函数虽然好用,但并不通用!使用场景仅限于对字符串的操作,如果我们要拷贝、比较的数据类型是整数或浮点数,字符串函数就哑火了。为此、C语言又为我们提供了不需要考虑数据类型的内存函数来实现这些功能,内存函数通过访问地址的方式操作对象,可以应用在任何类型的对象上面。它们分别是:内存拷贝函数(memcpy和memmove)、内存填充(设置)函数(memset)、内存比较函数(memcmp)。

QZW的博客 2148

《深入理解 C 语言内存操作函数:memcpy、memmove、memset 与 memcmp 全解析》

memcpy函数的原型如下:该函数用于将source指向的内存地址开始的num个字节数据复制到指向的内存地址。注意memcpy不会因为遇到'\0'而停止复制,且如果源地址与目标地址存在重叠,其行为是未定义的。memmove函数的原型与memcpy相同:与memcpy不同的是,memmove可以处理内存重叠的情况。它是更安全的复制函数。memset函数的原型如下:该函数用于将ptr指向的内存区域的前num个字节设置为value的值(按字节设置memcmp函数的原型如下:该函数用于比较ptr1。

月夜的风吹雨的博客 1117

C语言——内存函数

本文介绍了C语言中常用的四个内存操作函数:memcpy、memmove、memset和memcmp。 memcpy用于内存块拷贝,不能处理内存重叠情况; memmove功能类似memcpy但可以处理内存重叠; memset用于设置内存块内容,按字节操作; memcmp用于比较两块内存内容,可指定比较长度。 每个函数都给出了功能说明、参数解释、返回值和示例代码,并配有运行结果截图。特别强调了这些函数都需要包含<string.h>头文件,并指出了使用时的注意事项。

Chen_LSN的博客 850

C语言-内存操作函数

/void类型是不能进行计算的 只能进行强制类型转化 要转化成char*类型的原因是 一方面这个是指针 另一方面这个是按照字节大小进行计算拷贝的//或者写成这样 这里强制类型转化的情况下这样的话可以++while (num--)//这里是每次计算的时候减少一个字节 所以会直到为0 的时候自己跳出循环//进行强制类型转化的原因是因为这里是void类型 void类型是无法参与计算的 所以要进行强制类型转化//这里不能和拷贝库函数一样直接++ 因为void是无法参与计算的。

Jason_from_China的博客 2068
上一篇: 【C语言】标准库常用格式化输入输出函数:sprintf、sscanf
思路可以啊
博客等级 码龄6年 91粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值