C语言: C语言内存函数详解

C语言内存函数详解

目录

  1. memcpy 使用和模拟实现
  2. memmove 使用和模拟实现
  3. memset 函数的使用
  4. memcmp 函数的使用

1. memcpy 使用和模拟实现

函数原型

c 复制代码
void *memcpy(void *destination, const void *source, size_t num);

功能说明

  • 从 source 位置开始向后复制 num 个字节的数据到 destination 指向的内存位置
  • 遇到 '\0' 时不会停止复制
  • 如果 source 和 destination 有任何重叠,复制结果是未定义的

使用示例

c 复制代码
#include <stdio.h>
#include <string.h>

int main()
{
    int src[] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
    int dest[10] = {0};
    
    memcpy(dest, src, 5 * sizeof(int));
    
    for (int i = 0; i < 10; i++)
    {
        printf("%d ", dest[i]);
    }
    printf("\n");
    
    return 0;
}

模拟实现

c 复制代码
void *my_memcpy(void *dest, const void *src, size_t n)
{
    void *ret = dest;
    assert(dest != NULL);
    assert(src != NULL);
    
    // 逐字节复制
    while (n--)
    {
        *(char *)dest = *(char *)src;
        dest = (char *)dest + 1;
        src = (char *)src + 1;
    }
    
    return ret;
}

2. memmove 使用和模拟实现

函数原型

c 复制代码
void *memmove(void *destination, const void *source, size_t num);

功能说明

  • 与 memcpy 的区别在于 memmove 可以处理源内存块和目标内存块重叠的情况
  • 当源空间和目标空间出现重叠时,应使用 memmove 函数

使用示例

c 复制代码
#include <stdio.h>
#include <string.h>

int main()
{
    int data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    
    // 内存重叠的情况
    memmove(data + 2, data, 5 * sizeof(int));
    
    for (int i = 0; i < 10; i++)
    {
        printf("%d ", data[i]);
    }
    printf("\n");
    
    return 0;
}

输出结果:

复制代码
1 2 1 2 3 4 5 8 9 10

模拟实现

c 复制代码
void *my_memmove(void *dest, const void *src, size_t n)
{
    void *ret = dest;
    
    // 判断是否重叠以及复制方向
    if (dest <= src || (char *)dest >= ((char *)src + n))
    {
        // 无重叠或dest在src前面,从前向后复制
        while (n--)
        {
            *(char *)dest = *(char *)src;
            dest = (char *)dest + 1;
            src = (char *)src + 1;
        }
    }
    else
    {
        // 有重叠且dest在src后面,从后向前复制
        dest = (char *)dest + n - 1;
        src = (char *)src + n - 1;
        
        while (n--)
        {
            *(char *)dest = *(char *)src;
            dest = (char *)dest - 1;
            src = (char *)src - 1;
        }
    }
    
    return ret;
}

3. memset 函数的使用

函数原型

c 复制代码
void *memset(void *ptr, int value, size_t num);

功能说明

  • 用来设置内存,将内存中的值以字节为单位设置成指定内容
  • value 参数会被转换为 unsigned char 类型

使用示例

c 复制代码
#include <stdio.h>
#include <string.h>

int main()
{
    char text[] = "hello world";
    
    memset(text, 'A', 5);
    printf("%s\n", text);
    
    // 初始化数组
    int numbers[10];
    memset(numbers, 0, sizeof(numbers));
    
    return 0;
}

输出结果:

复制代码
AAAAAworld

4. memcmp 函数的使用

函数原型

c 复制代码
int memcmp(const void *ptr1, const void *ptr2, size_t num);

功能说明

  • 比较从 ptr1 和 ptr2 指针指向的位置开始,向后的 num 个字节
  • 返回值:
    • 返回值 < 0:ptr1 小于 ptr2
    • 返回值 = 0:ptr1 等于 ptr2
    • 返回值 > 0:ptr1 大于 ptr2

使用示例

c 复制代码
#include <stdio.h>
#include <string.h>

int main()
{
    char str1[] = "Program123";
    char str2[] = "Program456";
    int result;
    
    result = memcmp(str1, str2, sizeof(str1));
    
    if (result > 0)
        printf("'%s' 大于 '%s'\n", str1, str2);
    else if (result < 0)
        printf("'%s' 小于 '%s'\n", str1, str2);
    else
        printf("'%s' 等于 '%s'\n", str1, str2);
    
    return 0;
}

重点总结

  1. memcpy:用于非重叠内存的快速复制
  2. memmove:可处理重叠内存的安全复制
  3. memset:按字节设置内存内容
  4. memcmp:按字节比较内存内容

注意事项

  • 所有函数都是按字节操作的
  • 使用时要确保目标内存有足够的空间
  • 内存重叠时必须使用 memmove 而不是 memcpy
相关推荐
weixin_44073050几秒前
python+request实现接口-参数化小结
开发语言·python
CHHH_HHH6 分钟前
【Linux系统篇】深入解析Linux文件系统:从磁盘寻址到软硬链接
linux·服务器·开发语言·后端·ubuntu
yngsqq15 分钟前
窗体快速取消
java·开发语言
数模竞赛Paid answer25 分钟前
2025年中青杯数学建模A题康养城市建设求解全过程论文及程序
算法·数学建模·数据分析·中青杯
网安蟹佬霸26 分钟前
密码学安全实战:从加密原理到哈希破解的完整攻防指南
网络·算法·安全·web安全·开源·密码学·哈希算法
XiaQ091943 分钟前
Linux 常用命令学习笔记(用户管理篇):用户、组与权限的钥匙
linux·开发语言·笔记·学习
yangmu320343 分钟前
深度解析:短视频是如何通过“算法+神经机制”劫持用户时间的?
算法
不可求~1 小时前
C++ 报错交给 AI 之前,先准备好这 8 类信息
开发语言·c++·人工智能
LuminousCPP1 小时前
栈和队列专题(四):LeetCode 232. 用栈实现队列|双栈分工 + 按需迁移 + 摊还 O(1)
c语言·数据结构·笔记·算法·leetcode
名字还没想好☜1 小时前
用 Python struct 解析二进制协议:pack/unpack、字节序与对齐踩坑
开发语言·python·二进制·struct