c进阶篇(四):内存函数

news/2024/7/8 7:49:40 标签: c语言, 开发语言

内存函数以字节为单位更改

1.memcpy

memcpy 是 C/C++ 中的一个标准库函数,用于内存拷贝操作。它的原型通常定义在 <cstring> 头文件中,其作用是将一块内存中的数据复制到另一块内存中。

函数原型:void *memcpy(void *dest, const void *src, size_t n);

在 C++ 中,memcpy 函数也可以直接使用,但推荐使用类型安全的 std::memcpy,原型也在 <cstring> 头文件中声明:void* memcpy(void* dest, const void* src, size_t n);

参数解释

  • dest:目标内存的起始地址,即要将数据复制到的位置。

  • src:源内存的起始地址,即要从哪里复制数据。

  • n:要复制的字节数。

功能

memcpy 函数的作用是将 src 指向的内存区域的前 n 个字节复制到 dest 指向的内存区域。这意味着它能够高效地复制大块内存数据,常用于数组和结构体等数据结构的复制操作。

使用示例:

模拟实现:

void * memcpy ( void * dst, const void * src, size_t count)
{
        void * ret = dst;
 assert(dst);
   assert(src);
        /*
         * copy from lower addresses to higher addresses
         */
        while (count--) {
                *(char *)dst = *(char *)src;
                dst = (char *)dst + 1;
                src = (char *)src + 1;
       }
        return(ret);
}

注意事项

  • memcpy 不会检查内存的边界,因此在使用时要确保 dest 和 src 指向的内存区域不会发生重叠,否则结果将是不确定的。要处理可能重叠的情况,可以使用 memmove 函数。
  • 在 C++ 中,使用 std::memcpy 可以更好地与命名空间和重载机制配合,避免潜在的命名冲突。

2.memmove

在 C 语言中,memmove 的原型如下:void *memmove(void *dest, const void *src, size_t n);

在 C++ 中,memmove 函数同样可以直接使用,也推荐使用 std::memmove,其原型在 <cstring> 头文件中声明:void* memmove(void* dest, const void* src, size_t n);

参数解释

  • dest:目标内存的起始地址,即要将数据复制到的位置。

  • src:源内存的起始地址,即要从哪里复制数据。

  • n:要复制的字节数。

功能

memmove 函数与 memcpy 类似,都是将 src 指向的内存区域的前 n 个字节复制到 dest 指向的内存区域。不同的是,memmove 能够正确处理 destsrc 指向的内存区域有重叠的情况。具体来说,memmove 保证复制的结果是正确的,无论 srcdest 是否有重叠部分。

使用示例:

模拟实现:

void * memmove ( void * dst, const void * src, size_t count)
{
        void * ret = dst;
        if (dst <= src || (char *)dst >= ((char *)src + count)) {

                while (count--) {
                        *(char *)dst = *(char *)src;
                        dst = (char *)dst + 1;
                        src = (char *)src + 1;
               }
       }
        else {
                dst = (char *)dst + count - 1;
                src = (char *)src + count - 1;
                while (count--) {
                        *(char *)dst = *(char *)src;
                        dst = (char *)dst - 1;
                        src = (char *)src - 1;
               }
       }
        return(ret);
}

注意事项

  • memmove 比 memcpy 的实现可能会稍慢,因为它必须确保在处理重叠的情况下也能正确复制数据。
  • 如果确定 src 和 dest 不会重叠,使用 memcpy 可能更为高效。

http://www.niftyadmin.cn/n/5536863.html

相关文章

ffmpeg使用mjpeg把yuvj420p编码为jpg图像

version #define LIBAVCODEC_VERSION_MAJOR 60 #define LIBAVCODEC_VERSION_MINOR 15 #define LIBAVCODEC_VERSION_MICRO 100 note 1. 通过*.jpg推测时&#xff0c;out_fmt为image2&#xff0c;打开*.jpg文件时&#xff0c;in_fmt为image2 但是out_fmt为image2时&…

中英双语介绍美国的州:阿肯色州(Arkansas)

中文版 阿肯色州简介 阿肯色州&#xff08;Arkansas&#xff09;位于美国南部&#xff0c;以其多样的自然景观、丰富的文化遗产和不断发展的经济而闻名。以下是对阿肯色州的详细介绍&#xff0c;包括其地理位置、人口、经济、教育、文化和主要城市。 地理位置 阿肯色州东临…

【经验总结】Springboot打印指定类的日志到指定文件中

原文地址&#xff1a;https://www.cnblogs.com/zeng1994/p/f9bff238b13a0bf8fb8bf88c41db7a34.html 以下内容已经过实践&#xff0c;勘误&#xff0c;总结 环境&#xff1a;Springboot2.5.2 公司有个项目&#xff0c;需要和几个第三方系统对接。这种项目&#xff0c;日志一定要…

C++ | Leetcode C++题解之第214题最短回文串

题目&#xff1a; 题解&#xff1a; class Solution { public:string shortestPalindrome(string s) {int n s.size();vector<int> fail(n, -1);for (int i 1; i < n; i) {int j fail[i - 1];while (j ! -1 && s[j 1] ! s[i]) {j fail[j];}if (s[j 1] …

Vbus 和 Vbat

在嵌入式系统开发中&#xff0c;Vbus 和 Vbat 是两个不同的电源相关术语&#xff0c;它们的区别主要在于它们的用途和连接的电源类型。 Vbus 定义: Vbus 通常是指 USB 总线电压。在 USB 2.0 中&#xff0c;Vbus 通常为 5V 电源。用途: Vbus 提供电源给 USB 设备&#xff0c;确…

3.用户程序与驱动交互

驱动程序请使用第二章https://blog.csdn.net/chenhequanlalala/article/details/140034424 用户app与驱动交互最常见的做法是insmod驱动后&#xff0c;生成一个设备节点&#xff0c;app通过open&#xff0c;read等系统调用去操作这个设备节点&#xff0c;这里先用mknode命令调…

arm_uart4实验

#include "uart4.h" //UART //初始化 void hal_uart4_init() { //rcc_init //…

C#的多线程UI窗体控件显示方案

在C#中&#xff0c;特别是在使用Windows窗体&#xff08;WinForms&#xff09;或WPF&#xff08;Windows Presentation Foundation&#xff09;进行UI开发时&#xff0c;处理多线程与UI控件的交互需要特别小心。由于UI控件不是线程安全的&#xff0c;直接从非UI线程&#xff08…