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

C语言内存函数详解

文章目录

    • 前言
    • 一、`memcpy` 使用和模拟实现
      • 1. `memcpy` 的作用
      • 2. `memcpy` 使用示例
      • 3. `memcpy` 的模拟实现
    • 二、`memmove` 使用和模拟实现
      • 1. `memmove` 的作用
      • 2. `memmove` 使用示例
      • 3. `memmove` 的模拟实现
    • 三、`memset` 函数的使用
      • 1. `memset` 的作用
      • 2. `memset` 使用示例
    • 四、`memcmp` 函数的使用
      • 1. `memcmp` 的作用
      • 2. `memcmp` 使用示例
    • 总结

前言

在 C 语言中,内存操作是非常重要的一部分。C 语言提供了一组内存操作函数,包括 memcpymemmovememsetmemcmp,它们可以帮助我们高效地处理内存数据。

本篇博客将详细讲解这些内存函数的使用方式,并提供模拟实现,以便大家深入理解它们的工作原理。

1

一、memcpy 使用和模拟实现

1. memcpy 的作用

memcpy 用于从一个内存区域复制数据到另一个内存区域。

void *memcpy(void *dest, const void *src, size_t n);
  • dest:目标内存地址。
  • src:源内存地址。
  • n:要复制的字节数。

2. memcpy 使用示例

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

int main() {
    char src[] = "Hello, World!";
    char dest[20];
    
    memcpy(dest, src, strlen(src) + 1); // 复制字符串
    printf("dest: %s\n", dest);
    
    return 0;
}

3. memcpy 的模拟实现

void *my_memcpy(void *dest, const void *src, size_t n) {
    char *d = (char *)dest;
    const char *s = (const char *)src;
    
    while (n--) {
        *d++ = *s++;
    }
    return dest;
}

二、memmove 使用和模拟实现

1. memmove 的作用

memmovememcpy 类似,但它能正确处理内存重叠的情况。

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

2. memmove 使用示例

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

int main() {
    char str[] = "abcdef";
    memmove(str + 2, str, 4); // 处理内存重叠
    printf("str: %s\n", str);
    return 0;
}

3. memmove 的模拟实现

void *my_memmove(void *dest, const void *src, size_t n) {
    char *d = (char *)dest;
    const char *s = (const char *)src;
    
    if (d > s && d < s + n) { // 处理内存重叠
        d += n;
        s += n;
        while (n--) {
            *(--d) = *(--s);
        }
    } else {
        while (n--) {
            *d++ = *s++;
        }
    }
    return dest;
}

三、memset 函数的使用

1. memset 的作用

memset 用于将指定的字节值填充到某块内存中。

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

2. memset 使用示例

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

int main() {
    char arr[10];
    memset(arr, 'A', sizeof(arr)); // 用 'A' 填充整个数组
    for (int i = 0; i < 10; i++) {
        printf("%c ", arr[i]);
    }
    printf("\n");
    return 0;
}

四、memcmp 函数的使用

1. memcmp 的作用

memcmp 用于比较两块内存区域的内容。

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

返回值:

  • 0:两块内存内容相同。
  • 负值:s1 小于 s2
  • 正值:s1 大于 s2

2. memcmp 使用示例

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

int main() {
    char str1[] = "hello";
    char str2[] = "hello";
    char str3[] = "world";
    
    printf("str1 vs str2: %d\n", memcmp(str1, str2, 5));
    printf("str1 vs str3: %d\n", memcmp(str1, str3, 5));
    
    return 0;
}

总结

在本篇博客中,我们详细介绍了 C 语言的四个重要内存操作函数:

  1. memcpy:用于复制数据,不处理内存重叠。
  2. memmove:用于复制数据,可以正确处理内存重叠。
  3. memset:用于填充内存块。
  4. memcmp:用于比较内存块。

希望这篇博客能帮助大家更好地理解 C 语言的内存操作!

http://www.dtcms.com/a/106923.html

相关文章:

  • mycat--垂直分表--
  • mmaction2教程(2) QA
  • LangChain 使用向量数据库介绍与使用
  • Uniapp 持续出现 Invalid Host/Origin header 解决方法
  • Spring AOP + Redis缓存设计实战:基于注解的优雅三防方案(击穿/穿透/雪崩)
  • 【算法手记9】OR26 最长回文子串 NC369 [NOIP2002 普及组] 过河卒
  • 2024蓝桥杯国赛真题——数位翻转
  • 网络安全防护与挑战
  • 在uniapp中,video比普通的标签层级高解决问题
  • 项目实战--登录页面
  • 运维培训班之最佳选择(The best Choice for Operation and Maintenance Training Courses)
  • CSP-J/S冲奖第22天:时间复杂度
  • 内网服务器centos7安装jdk17
  • SSM-SpringMVC篇
  • 【JavaSE】String 类
  • 基于Rust与WebAssembly实现高性能前端计算
  • 一套AI训推一体化解决方案约等于100万个应用?
  • new/delete到底做了啥?
  • Python 数据类型 - 集合(set)
  • 【ACM MM 2024】FiLo++实验步骤总结
  • Python网络爬虫:从入门到实践
  • ROS2 高级组件中的webots介绍
  • 合并相同 patient_id 的 JSON 数据为数组
  • 自注意力与交叉注意力的PyTorch 简单实现
  • DAO 类的职责与设计原则
  • 绘制动态甘特图(以流水车间调度为例)
  • JWT(JSON Web Token)
  • Spring AI Alibaba 快速开发生成式 Java AI 应用
  • 每日总结4.2
  • 深入理解Python asyncio:从入门到实战,掌握异步编程精髓