C语言之内存函数

这篇具有很好参考价值的文章主要介绍了C语言之内存函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

内存函数:通常指的是在编程中用于处理内存操作的函数,这些函数可以用来分配、释放、复制、比较等内存相关的操作。在C语言中,这些内存函数 memcpy()memmove()memset()memcmp() 都需要引用头文件 <string.h>

1.memcpy函数

memcpy() 函数的原型如下:

void *memcpy(void *dest, const void *src, size_t n);
  • dest:目标内存地址,即要将数据复制到的位置。
  • src:源内存地址,即要复制数据的起始位置。
  • n:要复制的字节数。

memcpy() 函数会从源内存地址 src 复制 n 个字节的数据到目标内存地址 dest,并返回目标内存地址 dest

#include <stdio.h>

void *memcpy_custom(void *dest, const void *src, size_t n) {
    // 将源地址src的内容复制到目标地址dest
    // 注意:此处假设目标地址和源地址不会重叠

    // 将void指针转换为char指针,方便按字节进行操作
    char *p_dest = (char *)dest;
    const char *p_src = (const char *)src;

    // 逐字节复制数据
    for (size_t i = 0; i < n; i++) {
        p_dest[i] = p_src[i];
    }

    return dest;
}

int main() {
    char src[] = "Hello, world!";
    char dest[20];

    // 调用自定义的memcpy函数
    memcpy_custom(dest, src, sizeof(src));

    // 输出复制后的字符串
    printf("Copied string: %s\n", dest);

    return 0;
}

C语言之内存函数,C语言,c语言,开发语言

假设存在两片这样的空间由两个指针“dest”和“src”维护,解引用赋值过去相当于copy过去一个字节

然后“dest++”和“src++”就指向下一内存单元,重复之前的操作直至来到最后一个内存单元,也就是第n个,至此操作完成返回目标内存的起始地址

C语言之内存函数,C语言,c语言,开发语言

2.memmove函数

memmove() 类似于 memcpy(),但更安全,可以处理内存块重叠的情况,内存块重叠情况就是当我们

src所指向的内存块和dest所指向的内存块发生重叠的情况,如下图

C语言之内存函数,C语言,c语言,开发语言

当我们如果想进行像memcpy() 那样操作时就会篡改src所指向的内存块从而达不到copy效果当我们走到最后变成这样

C语言之内存函数,C语言,c语言,开发语言

而memmove就是避免这种情况而造就的,实现原理也很简单当src的起始位置大于dest的起始位置,我们就从后往前复制,当src的起始位置小于dest的起始位置,就从前向后复制,至此实现正确复制,这样做的原理就是先把重合部分拿出来复制,这样就可以避免篡改源内存块

memmove实现

#include <stdio.h>

void *memmove_custom(void *dest, const void *src, size_t n) {
    // 将源地址src的内容复制到目标地址dest
    // 处理重叠情况时,从后往前复制

    // 将void指针转换为char指针,方便按字节进行操作
    char *p_dest = (char *)dest;
    const char *p_src = (const char *)src;

    // 处理重叠情况时,从后往前复制
    if (p_dest > p_src && p_dest < p_src + n) {
        for (size_t i = n - 1; i < n; i--) {
            p_dest[i] = p_src[i];
        }
    } else {
        // 普通情况下,从前往后复制
        for (size_t i = 0; i < n; i++) {
            p_dest[i] = p_src[i];
        }
    }

    return dest;
}

int main() {
    char src[] = "Hello, world!";
    char dest[20];

    // 调用自定义的memmove函数
    memmove_custom(dest, src, sizeof(src));

    // 输出复制后的字符串
    printf("Copied string: %s\n", dest);

    return 0;
}

3.memcmp函数

memcmp() 是C语言中用于比较内存区域的函数,类似于strncmp函数但是memcmp更加通用,因为它比较的是内存中的值而不只限于字符串

其原型如下:

int memcmp(const void *s1, const void *s2, size_t n);
  • s1:指向要比较的第一个内存区域的指针。
  • s2:指向要比较的第二个内存区域的指针。
  • n:要比较的字节数。

memcmp() 函数会比较 s1s2 所指向的内存区域的前 n 个字节,并返回一个整数来表示比较结果。

  • 如果第一个区域的字节值小于第二个区域的字节值,则返回负值。
  • 如果第一个区域的字节值大于第二个区域的字节值,则返回正值。
  • 如果两个区域的字节值都相等,则返回0。

实现:文章来源地址https://www.toymoban.com/news/detail-831378.html

#include <stdio.h>

int memcmp_custom(const void *s1, const void *s2, size_t n) {
    // 将void指针转换为char指针,方便按字节进行比较
    const unsigned char *p1 = (const unsigned char *)s1;
    const unsigned char *p2 = (const unsigned char *)s2;

    // 逐字节比较数据
    for (size_t i = 0; i < n; i++) {
        if (p1[i] != p2[i]) {
            // 如果有不相等的字节,则返回它们的差值
            return (p1[i] > p2[i]) ? 1 : -1;
        }
    }

    // 如果所有字节都相等,则返回0
    return 0;
}

int main() {
    char s1[] = "Hello";
    char s2[] = "Hella";

    // 调用自定义的memcmp函数
    int result = memcmp_custom(s1, s2, 5);

    if (result == 0) {
        printf("s1 和 s2 相等\n");
    } else if (result > 0) {
        printf("s1 大于 s2\n");
    } else {
        printf("s1 小于 s2\n");
    }

    return 0;
}

4.memset函数

memset() 是C语言中用于设置内存块的函数,其原型如下

void *memset(void *s, int c, size_t n);
  • s:指向要设置的内存块的指针。
  • c:要设置的值,以整数形式给出,通常是一个字节的值。
  • n:要设置的字节数。

memset() 函数将指定的值 c 复制到 s 所指向的内存块的前 n 个字节中。通常情况下,c 是一个无符号字符或整数(0~255),会被转换成无符号字符并复制到内存块中。

memset() 主要用于初始化内存块,可以用来快速将一段内存区域填充为指定的值。它经常用于数组初始化、清除内存等操作。

实现:

#include <stdio.h>

void *memset_custom(void *s, int c, size_t n) {
    // 将指定的值c复制到s所指向的内存块的前n个字节中

    // 将void指针转换为char指针,方便按字节进行操作
    unsigned char *p = (unsigned char *)s;

    // 将指定的值复制到内存块中
    for (size_t i = 0; i < n; i++) {
        p[i] = (unsigned char)c;
    }

    return s;
}

int main() {
    char arr[10];

    // 调用自定义的memset函数,将数组arr的前5个字节设置为'a'的ASCII码值
    memset_custom(arr, 'a', 5);

    // 输出设置后的数组内容
    for (int i = 0; i < 10; i++) {
        printf("%c ", arr[i]);
    }
    printf("\n");

    return 0;
}

到了这里,关于C语言之内存函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言-内存管理函数

    malloc 申请动态内存空间 viod *malloc(size_t size); 在堆上,需要手动释放。 free 释放动态内存空间 void free(void *ptr);释放堆上的内存 calloc 申请并初始化一系列内存空间 void *calloc(size_t nmemb, size_t size);初始为0。 realloc 重新分配内存空间 viod *realloc(void *ptr, size_t size);重新分配并拷贝。

    2024年02月07日
    浏览(24)
  • C语言 之 内存函数

      目录 导图  memcpy的使用和函数模拟实现 memcpy的使用 整型类型   字符类型 memcpy函数模拟实现 memmove的使用和函数模拟实现  memmove的使用 memmove函数模拟实现 小结 memset的使用 memcmp的使用   memcpy的使用 函数原型: void* memcpy(void* destination,const void* source,size_t num) memcpy:从sour

    2024年03月13日
    浏览(23)
  • C - 语言->内存函数

    目录 系列文章目录 前言 1. memcpy使⽤和模拟实现 1.2 memcpy函数的模拟实现: 2. memmove 使⽤和模拟实现 2.1memmove的模拟实现: 3. memset 函数的使⽤ 4. memcmp 函数的使⽤ ✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:橘橙黄又青_C语言,指

    2024年02月04日
    浏览(22)
  • 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函数的

    2024年01月18日
    浏览(23)
  • C语言之内存函数

    内存函数:通常指的是在编程中用于处理内存操作的函数,这些函数可以用来分配、释放、复制、比较等内存相关的操作。在C语言中,这些内存函数 memcpy() 、 memmove() 、 memset() 、 memcmp() 都需要引用头文件 string.h 。 memcpy() 函数的原型如下: dest :目标内存地址,即要将数据

    2024年02月21日
    浏览(19)
  • C语言-详解内存函数

    它的函数原型如下: 具体的函数介绍如下: 好,相信同学们看了这个函数,应该是能够简单了解函数中各个参数的用法。 下面我们来总结一下: 函数 memcpy 从 source 的位置开始向后复制 num 个字节的数据到 destination 指向的内存位置。 这个函数在遇到 \\\'\\0\\\' 的时候并不会停下来。

    2024年04月16日
    浏览(42)
  • C语言内存函数详解

    本章内容主要讲解:memcpy(内存拷贝函数),memmove(内存移动函数),memcmp(内存比较函数)的 基本作用 和 模拟实现 。 1.memcpy函数 函数功能:从source指向的内存空间处拷贝num个字节的内容到destination指向的内存中, 当拷贝的内容是 \\\'\\0\\\' 时,函数不会主动停下来,除非拷贝的内容达

    2024年02月14日
    浏览(25)
  • C语言-内存函数详解

    返回类型和参数: 1.函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。 2.这个函数在遇到 ‘\\0’ 的时候并不会停下来。 3. 如果source和destination有任何的重叠,复制的结果都是未定义的。 4.注意单位是字节 5.头文件:#includestring.h memcpy使用: 运行

    2024年02月05日
    浏览(27)
  • 初识C语言·内存函数

    目录 1 memcpy的使用和模拟实现 2 memmove的使用和模拟实现 3 memset的使用和模拟实现 4 memcmp的使用和模拟实现 紧接字符串函数,出场的是第一个内存函数memcpy。前面讲的字符串函数是专门干关于字符串的事的,而这个函数可以干strcpy一样的事,但是区别就是它碰到\\0也会继续复制

    2024年01月20日
    浏览(48)
  • 【C语言进阶篇】C语言内存函数

    【C语言进阶篇】C语言内存函数  🌈个人主页: 开敲 🔥 所属专栏: C语言 🌼文章目录🌼 1.memcpy函数及其模拟实现     1.1 memcpy函数的使用     1.2 memcpy函数的模拟实现 2.memmove函数及其模拟实现     2.1 memmove函数的使用     2.2 memmove函数的模拟实现 3.memset函数 4.memcmp函数

    2024年04月14日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包