目录
memcpy函数的使用和模拟实现
void * memcpy ( void * destination, const void * source, size_t num );
头文件是<string.h>
1、函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
2、这个函数在遇到 '\0' 的时候并不会停下来。
3、如果source和destination有任何的重叠,复制的结果都是未定义的。memcpy对内存重叠的情况不负责(例如:a1,a1+2)
(memcpy
函数用于将源内存块中的数据复制到目标内存块中,但不允许源内存块和目标内存块重叠。如果重叠,memcpy
的行为是未定义的,可能导致数据损坏。)
函数的使用:
#include <stdio.h>
#include <string.h>
int main() {
int a[] = { 1,2,3,4,5,6,7,8 };
int b[20] = { 0 };
memcpy(b, a, 20);
for (int i = 0; i < 20; i++) {
printf("%d ", b[i]);
}
return 0;
}
函数的模拟:
#include <stdio.h>
#include <assert.h>
void* my_memcpy(void* des, const void* sour, size_t n) {
assert(des && sour);
while (n--) {
//解引用后一次访问一个字节,一个字节一个字节的复制给des
*((char*)des)++ = *((char*)sour)++;
}
}
int main() {
int a[] = { 1,2,3,4,5,6,7,8 };
int b[20] = { 0 };
my_memcpy(b, a, 20);
for (int i = 0; i < 20; i++) {
printf("%d ", b[i]);
}
return 0;
}
*((char*)des)++ = *((char*)sour)++; 先将指针的类型强制转换为char* ,使它一次只能位移一个字节大小的空间,解引用后即为这1个字节的空间中的值
这一句代码的原理如下图:
memmove函数的使用和模拟
void * memmove ( void * destination, const void * source, size_t num );
num的单位是字节
头文件是<string.h>
1、和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
2、如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。memmove函数针对源空间和目标空间重叠的情况
(memmove
函数会根据内存块的重叠情况,选择合适的方式进行数据复制,确保数据不会被损坏。)
函数的使用:
#include <stdio.h>
#include <string.h>
int main() {
int a[20] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(a + 2, a, 20);
for (int i = 0; i < 20; i++) {
printf("%d ", a[i]);
}
return 0;
}
a+2 开始往后被赋值为1,2,3,4,5
函数的模拟:
不创建新数组,当有源空间与目标空间有重叠时的赋值方法如下:
1、
2、
#include <stdio.h>
#include <assert.h>
void* my_memmove(void* dest, const void* src, size_t n) {
assert(dest && src);
if (dest > src) {
//后到前
//指定到第20个字节处
(char*)src += n - 1;
(char*)dest += n - 1;
while (n--) {
*((char*)dest)-- = *((char*)src)--;
}
}
else {
//前到后
while (n--) {
*((char*)dest)++ = *((char*)src)++;
}
}
}
int main() {
int a[20] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(a, a + 2, 20);
for (int i = 0; i < 10; i++) {
printf("%d ", a[i]);
}
return 0;
}
最后结果为:3 4 5 6 7 6 7 8 9 10
memset函数的使用
void * memset ( void * ptr, int value, size_t num );
num的单位是字节
头文件是<string.h>
1、memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容
2、对于整型数组,value的值只能是0,因为num的单位是字节;如果value的值是1,则会将整型数据中的4个字节全部改为1,结果是一个非常大的数
函数的使用:
#include <stdio.h>
#include <string.h>
int main() {
char a[] = "hello world";
memset(a, 'x', 5);
printf("%s\n", a);
return 0;
}
结果:xxxxx world
memcmp函数的使用
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
1、比较从ptr1和ptr2指针指向的位置开始,向后的num个字节
2、如果在num个字节之前就比较出了大小,则停止,num相当于最多向后num个字节
当 ptr1 > ptr2 时返回 一个大于0的数,相等时返回0,小于时返回一个小于0的数
#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' is greater than '%s'.\n", buffer1, buffer2);
else if (n < 0)
printf("'%s' is less than '%s'.\n", buffer1, buffer2);
else
printf("'%s' is the same as '%s'.\n", buffer1, buffer2);
return 0;
}
创作不易,喜欢的话点个赞吧~~