耕耘 :C、C++、嵌入式技术领域
✨**不要等待机会,而要创造机会!**✨
📽博主简介:
✨✨一位热爱生活的阳光大男孩.✨✨</font# 前言
前言
本文系统讲解了C语言中四个核心的内存操作函数:memcpy、memmove、memset 和 memcmp。它们直接操作内存字节,是底层编程和性能优化的利器。文章将从函数原型、功能特性、参数解析到实际应用,通过清晰的代码示例逐一剖析,帮助你深入理解并掌握这些函数的使用场景与注意事项。</font# 前言
1. memcpy
void * memcpy ( void * destination, const void * source, size_t num );
功能:
1、memcpy 是完成内存块拷⻉的,不关注内存中存放的数据是啥
2、函数 memcpy 从 source 的位置开始向后复制 num 个字节的数据到 destination 指向的内存
位置。
3、如果 source 和 destination 有任何的重叠,复制的结果都是未定义的。(内存重叠的情况使⽤ memmove 就⾏)
4、memcpy 的使⽤需要包含 <string.h>
参数:
destination :指针,指向⽬标空间,拷⻉的数据存放在这⾥
source :指针,指向源空间,要拷⻉的数据从这⾥来
num :要拷⻉的数据占据的字节数
返回值:
拷⻉完成后,返回⽬标空间的起始地址
示例代码:
#include <stdio.h>
#include <string.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
memcpy(arr2, arr1, 20);//从arr1开始拷贝20个字节到arr2中
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}

2. memmove
void * memmove ( void * destination, const void * source, size_t num );
功能:
1、功能和memcpy是一样的,只是多了可以拷贝重复的内容的功能
参数:
destination :指针,指向⽬标空间,拷⻉的数据存放在这⾥
source :指针,指向源空间,要拷⻉的数据从这⾥来
num :要拷⻉的数据占据的字节数
返回值:
拷⻉完成后,返回⽬标空间的起始地址
示例代码:
#include <stdio.h>
#include <string.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr1 + 2, arr1, 20);//内存重叠//arr1 + 2表示,拷贝的东西从这里开始放
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}

3. memset
void * memset ( void * ptr, int value, size_t num );
功能:
• memset 函数是⽤来设置内存块的内容的,将内存中指定⻓度的空间设置为特定的内容。
• memset 的使⽤需要包含 <string.h>
参数:
ptr :指针,指向要设置的内存空间,也就是存放了要设置的内存空间的起始地址。
value :要设置的值,函数将会把 value 值转换成 unsigned char 的数据进⾏设置的。 也就是
以字节为单位来设置内存块的。
num :要设置的内存⻓度,单位是字节。
返回值:返回的是要设置的内存空间的起始地址
示例代码:
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "hello world";
memset(str, 'x', 6);//将str中从首元素开始的6个字节替换为'x'
printf(str);//str是字符串参数可以用printf直接打印
return 0;
}

总结:
当有⼀块内存空间需要设置内容的时候,就可以使⽤memset函数,值得注意的是memset函数对内存单元的设置是以字节为单位的。
例如:
#include <stdio.h>
#include <string.h>
int main()
{
int str[] = { 1,2,3,4,5,6,7,8,9 };
memset(str, '1', 11); //int类型是4个字节但是,memset是一个一个字节改,所以是错误的写法
for (int i = 0; i < 9; i++)
{
printf("%d ", str[i]);
}
return 0;
}
4. memcmp
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
功能:
⽐较指定的两块内存块的内容,⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节
memcmp 的使⽤需要包含 <string.h>
参数:
ptr1:指向第一块内存区域的指针。
ptr2:指向第二块内存区域的指针。
num:要比较的字节数。
返回值:
若两块内存内容相同,返回 0。
若 ptr1 的第一个不同字节值小于 ptr2 的对应字节值,返回负数。
若 ptr1 的第一个不同字节值大于 ptr2 的对应字节值,返回正数。
示例代码:
#include <stdio.h>
#include <string.h>
int main()
{
char buffer1[] = "DWgaOtP12df0";
char buffer2[] = "DWGAOTP12DF0";
int n;
n = memcmp(buffer1, buffer2, sizeof(buffer1));
if (n > 0)
printf("'%s' 大于'%s'.\n", buffer1, buffer2);
else if (n < 0)
printf("'%s' 小于 '%s'.\n", buffer1, buffer2);
else
printf("'%s' 和 '%s' ⼀样.\n", buffer1, buffer2);
return 0;
}

总结
如果要⽐较2块内存单元的数据的⼤⼩,可以使⽤ memcmp 函数,这个函数的特点就是可以指定⽐较⻓度。
结语
“点赞的瘦十斤,评论的暴富,转发的永远不秃头!”
完

1545

被折叠的 条评论
为什么被折叠?



