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

wordpress 站内信软件开发公司服务

wordpress 站内信,软件开发公司服务,建设门户网站发展前景2018,工商营业执照注册网目录 一. memcpy的使用和模拟实现 1.1 memcpy函数理解 1.2 memcpy使用示例 1.3 memcpy模拟实现 二. memmove使用和模拟实现 2.1 memove函数理解 2.2 memove使用示例 2.3 memmove vs memcpy 2.4 memmove函数模拟实现 三. memset函数的使用 3.1 memset函数理解 3.1 me…

目录

一. memcpy的使用和模拟实现

1.1 memcpy函数理解

1.2 memcpy使用示例

         1.3 memcpy模拟实现

二. memmove使用和模拟实现

2.1 memove函数理解

2.2 memove使用示例

2.3 memmove vs memcpy

2.4 memmove函数模拟实现

三. memset函数的使用

3.1 memset函数理解

3.1 memset使用示例

四. memcmp函数的使用

4.1 memcmp 函数理解

4.2 memcmp使用示例


一. memcpy的使用和模拟实现

1.1 memcpy函数理解

memcpy 是 C 标准库(<string.h>)中的一个函数,用于按字节复制内存块。它的原型如下:

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

参数说明

参数

类型

说明

dest

void*

目标内存地址(复制到哪)

src

const void*

源内存地址(从哪复制)

n

size_t

要复制的字节数

返回值

  • 返回 dest 的指针(即目标内存地址)。

memcpy 的特点

  1. 不检查重叠(Undefined Behavior if Overlapping)

    • 如果 src 和 dest 的内存区域重叠,行为是未定义的(UB),可能导致数据错误。

    • 如果可能重叠,应该使用 memmove(它会正确处理重叠情况)。

  2. 按字节复制

    • 不管数据类型(intchar、结构体等),直接按字节复制。

  3. 不关心 '\0'(与 strcpy 不同)

    • strcpy 遇到 '\0' 停止,而 memcpy 严格复制 n 个字节。

1.2 memcpy使用示例

1. 复制数组

#include <stdio.h>
#include <string.h>int main() {int src[5] = {1, 2, 3, 4, 5};int dest[5];memcpy(dest, src, sizeof(src));  // 复制整个数组for (int i = 0; i < 5; i++) {printf("%d ", dest[i]);  // 输出:1 2 3 4 5}return 0;
}

2. 复制结构体

#include <stdio.h>
#include <string.h>typedef struct {int id;char name[20];
} Person;int main() {Person p1 = {1, "Alice"};Person p2;memcpy(&p2, &p1, sizeof(Person));  // 复制整个结构体printf("ID: %d, Name: %s\n", p2.id, p2.name);  // 输出:ID: 1, Name: Alicereturn 0;
}

1.3 memcpy模拟实现

#include<stdio.h>
#include<string.h>
#include<assert.h>void* my_memcpy(void* dest, const void* source, size_t num)
{// 断言检查:确保 dest 和 source 不是 NULLassert(dest && source);// 保存目标地址的起始位置,用于返回void* ret = dest;// 逐字节复制,共复制 num 个字节while (num--){// 将 source 的当前字节复制到 dest*(char*)dest = *(char*)source;// 移动 dest 和 source 指针到下一个字节dest = (char*)dest + 1;source = (char*)source + 1;}// 返回目标内存的起始地址return ret;
}int main()
{int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[20];my_memcpy(arr2, arr1, 40);int i = 0;for (i = 0;i < 10;i++){printf("%d ", arr2[i]);}return 0;
}

二. memmove使用和模拟实现

2.1 memove函数理解

memmove 是 C 标准库(<string.h>)中的一个函数,用于安全地复制内存块,即使源内存和目标内存有重叠也能正确处理。它的原型如下:

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

参数说明

参数

类型

说明

dest

void*

目标内存地址(复制到哪)

src

const void*

源内存地址(从哪复制)

n

size_t

要复制的字节数

返回值

  • 返回 dest 的指针(即目标内存地址)。


memmove 的特点

  1. 正确处理内存重叠

    • 如果 src 和 dest 的内存区域重叠memmove 会确保数据正确复制(不会像 memcpy 那样出现未定义行为)。

    • 实现方式:检查内存重叠情况,决定是从前往后复制还是从后往前复制。

  2. 按字节复制

    • 不管数据类型(intchar、结构体等),直接按字节复制。

  3. 不关心 '\0'(与 strcpy 不同)

    • strcpy 遇到 '\0' 停止,而 memmove 严格复制 n 个字节。

2.2 memove使用示例

#include <stdio.h>
#include <string.h>int main() {char str[] = "Hello, World!";// 把 "World!" 移动到前面(src 和 dest 重叠)memmove(str, str + 7, 6);  // 正确// memcpy(str, str + 7, 6);  // ❌ 未定义行为(UB)printf("%s\n", str);  // 输出:World! World!return 0;
}

2.3 memmove vs memcpy

函数是否处理重叠速度适用场景
memcpy❌ 不处理(UB)⚡ 更快确定不重叠时使用
memmove✅ 安全处理🐢 稍慢可能重叠时使用

memmove 的实现原理

memmove 的底层实现通常会检查内存是否重叠:

  • 如果 dest < src:从前往后复制(避免覆盖未复制的数据)。

  • 如果 dest > src:从后往前复制(避免覆盖未复制的数据)。

2.4 memmove函数模拟实现

#include<stdio.h>   // 标准输入输出头文件
#include<assert.h>  // 断言头文件,用于调试检查// 自定义的内存移动函数,功能类似于标准库的memmove
// 参数:
//   dest - 目标内存地址
//   src - 源内存地址
//   num - 要移动的字节数
// 返回值:返回目标内存地址
void* my_memmove(void* dest, const void* src, size_t num)
{// 使用断言确保dest和src都不是空指针assert(dest && src);// 保存目标地址的原始值,用于返回void* ret = dest;// 判断目标地址是否在源地址之前if (dest < src){// 从前向后拷贝(适用于目标地址在源地址之前的情况)while (num--){// 逐字节拷贝*(char*)dest = *(char*)src;// 移动指针到下一个字节dest = (char*)dest + 1;src = (char*)src + 1;}}else{// 从后向前拷贝(适用于目标地址在源地址之后的情况)// 这样可以防止重叠区域被覆盖while (num--){// 从末尾开始拷贝*((char*)dest + num) = *((char*)src + num);}}// 返回目标地址return ret;
}int main()
{// 测试数组int arr[] = { 1,2,3,4,5,6,7,8,9,10 };// 调用my_memmove函数:// 将arr+2开始的20个字节(即5个int)移动到arr开始的位置// 相当于把3,4,5,6,7移动到1,2,3,4,5的位置my_memmove(arr, arr + 2, 20);// 打印移动后的数组for (int i = 0; i < 10; i++){printf("%d  ", arr[i]);}return 0;
}

关键实现细节

  • 通过比较 dest 和 src 的地址决定拷贝方向
  • 当 dest < src 时,从前向后拷贝(避免覆盖未拷贝的数据)
  • 否则,从后向前拷贝(同样是为了避免数据覆盖问题)
  • 使用 char* 指针进行逐字节操作

三. memset函数的使用

3.1 memset函数理解

memset 是 C/C++ 标准库中的一个内存操作函数,用于将一块内存区域填充为指定的值。

函数原型

void *memset(void *ptr, int value, size_t num);

参数说明

  • ptr: 指向要填充的内存块的指针

  • value: 要设置的值(以 int 形式传递,但实际使用时会被转换为 unsigned char)

  • num: 要填充的字节数

功能

memset 将从 ptr 开始的内存区域的前 num 个字节都设置为 value 的值。

常见用途

  1. 初始化数组为0:

    int arr[100];
    memset(arr, 0, sizeof(arr));
    
  2. 初始化结构体:

    struct MyStruct s;
    memset(&s, 0, sizeof(s));

3.1 memset使用示例

#include <stdio.h>
#include <string.h>
int main()
{char str[] = "hello world";memset(str, 'C', 6);printf(str);return 0;
}

我们来看下面这一串代码,判断能不能将arr的每个元素设置为1

int main()
{int arr1[] = { 0 };memset(arr1, 1, 40);return 0;
}

结果是不行,但是可以把一个数组里的都设置为0; 

四. memcmp函数的使用

4.1 memcmp 函数理解

memcmp 是 C/C++ 标准库中的一个内存比较函数,用于比较两块内存区域的内容。

函数原型

int memcmp(const void *ptr1, const void *ptr2, size_t num);

参数说明

  • ptr1: 指向第一个内存块的指针

  • ptr2: 指向第二个内存块的指针

  • num: 要比较的字节数

返回值

  • 负数ptr1 小于 ptr2 (按字典序)

  • 0ptr1 和 ptr2 相等

  • 正数ptr1 大于 ptr2 (按字典序)

功能

memcmp 逐字节比较 ptr1 和 ptr2 指向的内存区域的前 num 个字节,直到发现不匹配的字节或比较完所有字节。

常见用途

  1. 比较数组内容:

    int arr1[5] = {1, 2, 3, 4, 5};
    int arr2[5] = {1, 2, 3, 4, 5};
    if (memcmp(arr1, arr2, sizeof(arr1)) == 0) {printf("Arrays are equal\n");
    }
    
  2. 比较结构体:

    struct Point { int x; int y; };
    struct Point p1 = {1, 2};
    struct Point p2 = {1, 2};
    if (memcmp(&p1, &p2, sizeof(struct Point)) == 0) {printf("Points are equal\n");
    }
    
  3. 比较字符串(不依赖null终止符):

    char str1[10] = "hello";
    char str2[10] = "hello";
    if (memcmp(str1, str2, 5) == 0) {printf("First 5 chars are equal\n");
    }
    

与 strcmp 的区别

特性

memcmpstrcmp
比较方式比较指定字节数比较到遇到null终止符
安全性更安全(指定长度)需要确保字符串有终止符
性能通常更快需要检查每个字符是否为终止符
用途任意内存区域比较仅用于字符串比较

4.2 memcmp使用示例

#include <stdio.h>
#include <string.h>
int main()
{char buffer1[] = "ABCDEFG";char buffer2[] = "LOVEYOU";int n;n = memcmp(buffer1, buffer2, sizeof(buffer1));if (n > 0)printf("'%s' is greater than '%s'.\n", buffer1, buffer2);else if (n < 0)printf("'%s' is less than '%s'.\n", buffer1, buffer2);elseprintf("'%s' is the same as '%s'.\n", buffer1, buffer2);return 0;
}

结语:本篇文章内容就到此结束,继前面一篇文章后,在此篇文章中给大家继续分享了C语言内存函数中memcpy和memmove的使用和模拟实现,memset函数的使用,memcmp函数的使用等知识点,后续会继续给分享其它内容,如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持。


往期回顾:

《C 语言字符串操作从入门到实战(上篇):字符分类、转换及strlen/strcpy等函数详解》
《C 语言字符串操作从入门到实战(下篇):strncpy/strncat/strstr 等函数原理与实现》

 


文章转载自:

http://s7VISd6t.nswcw.cn
http://WBH0UPli.nswcw.cn
http://D44Ra4nY.nswcw.cn
http://e5cMnR3d.nswcw.cn
http://9GjwRAWc.nswcw.cn
http://Xy2DkDBv.nswcw.cn
http://ffSWKSwe.nswcw.cn
http://sZcwpqX6.nswcw.cn
http://6EhR9rzF.nswcw.cn
http://u14GVB5z.nswcw.cn
http://CM7iSZEB.nswcw.cn
http://ojFNy0Q5.nswcw.cn
http://8qiCKl3V.nswcw.cn
http://qUr70LAM.nswcw.cn
http://xnSeOnxD.nswcw.cn
http://Ex6FwkQx.nswcw.cn
http://SaKnWJHC.nswcw.cn
http://Y6fcegTM.nswcw.cn
http://pEm3HAH5.nswcw.cn
http://ebtOyl1v.nswcw.cn
http://w4Zpc8hX.nswcw.cn
http://cNXF5niD.nswcw.cn
http://ZqWZvWHg.nswcw.cn
http://EDZG1Y6I.nswcw.cn
http://9XKSzebF.nswcw.cn
http://D2Fp0diB.nswcw.cn
http://r0ObGfEk.nswcw.cn
http://GfiSR8sf.nswcw.cn
http://go2XGxzh.nswcw.cn
http://RCTY8CPs.nswcw.cn
http://www.dtcms.com/wzjs/683413.html

相关文章:

  • 浙江建设培训中心网站手机个人网站制作教程
  • 小学网站建设成都wordpress 二级页面
  • 济南网站建设认可搜点网络WordPress修改数据库地址
  • 网站备案格式买一个网站需要多少钱
  • 艺术学校示范校建设专题网站百度爱采购网站官网
  • 网站建设只是凯叔讲故事网站谁做的
  • 通过模版做网站商河网站建设公司
  • 专做短篇的网站wordpress模板淘客
  • 视频直播网站开发 设计石家庄网站建设选汉狮
  • 网站排名下降了怎么办浙江网站建设优化
  • 网站流量 钱软件开发公司网站设计
  • 电商网站建设与管理 教案东莞市微信网站建设品牌
  • 赶集网网站建设费用wordpress 长腿蜘蛛
  • 用 net做网站湖南优度网络科技有限公司
  • 企业网站关键词查看注册过的网站
  • 手机网站建站用哪个软件好opensuse wordpress
  • wordpress页面静态化生成天津做优化的网站有多少家
  • 做3d效果图的网站免费大数据平台
  • 做商城网站佛山 网站建设
  • 山东诚祥建设集团公司网站怎样自己制作网站
  • 网站建设策划有哪些上海网络推广方法
  • 域名转发网站微信公众号运营分析报告
  • 天猫优惠卷怎么做网站黑科技赚钱软件
  • 网站做app的软件叫什么wordpress 婚恋
  • 网络上建个网站买东西多少钱能够做代理的网站
  • 营销型网站四大元素网站开发支持环境
  • 网站制作jian she永久免费crm软件哪个好
  • 芜湖手机网站开发专做中医教学网站
  • 上海网站营销wordpress封面图插件
  • 顺德品牌网站别人做的网站怎么seo优化