目录
1.memcpy的使用和模拟实现
使用方法:
memcpy函数用于将源内存区域的内容复制到目标内存区域。其使用方法如下:
void *memcpy(void *dest, const void *src, size_t n);
dest
:目标内存区域的指针,指向要复制到的内存区域。src
:源内存区域的指针,指向要复制的内存区域。n
:要复制的字节数。
返回值:指向目标内存区域的指针。
注意事项:
dest
和src
指针所指向的内存区域不能重叠,否则复制的结果是不确定的。- 如果要复制的字节数
n
超过了目标和源内存区域的大小,会导致访问越界。 memcpy
函数是按字节进行复制的,可以用于复制任意类型的数据。
示例:
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = { "this is a dog" };
char arr2[20] = { 0 };
memcpy(arr2, arr1, 7);
printf("%s", arr2);
return 0;
}
以上示例中,将源字符串src
的内容复制到了目标字符串dest
中,通过strlen(src) + 1
可以获取到源字符串的长度(包括字符串结尾的\0
),确保复制的内容能够完整保存。
模拟实现:
#include<stdio.h>
#include<assert.h>
#include<string.h>
void* my_memcpy(void* p1, const void* p2, size_t num)
{
assert(p1 && p2);
void* crt = (char*)p1;
while (num--)
{
*(char*)p1 = *(char*)p2;
p1 = (char*)p1 + 1;
p2 = (char*)p2 + 1;
}
return(crt);
}
int main()
{
char arr1[] = { "this is a dog" };
char arr2[20] = { 0 };
my_memcpy(arr2, arr1, 7);
printf("%s", arr2);
return 0;
}
2.memmoved 使用和模拟实现
使用方法:
memmove是C语言中的一个函数,用于在内存中复制一段数据。其函数原型为:
void *memmove(void *dest, const void *src, size_t n);
其中,dest
为目标内存地址,src
为源内存地址,n
为要复制的字节数。
memmove函数的使用方法如下:
1.创建目标内存空间,用于存放复制后的数据。
void *dest = malloc(n);
2.调用memmove函数进行数据复制。
memmove(dest, src, n);
3.使用复制后的数据。
// 使用复制后的数据
4.释放目标内存空间。
free(dest);
需要注意的是,memmove函数能够处理源内存和目标内存有重叠的情况,而memcpy函数则不能。因此,在源内存和目标内存有重叠的情况下,应该优先选择使用memmove函数。
#include<stdio.h>
#include<assert.h>
#include<string.h>
int main()
{
char arr1[] = { "this is a dog" };
memmove(arr1, arr1 + 9, 4);
printf("%s", arr1);
return 0;
}
模拟实现:
#include<stdio.h>
#include<assert.h>
#include<string.h>
void* my_memmove(void* p1, const void* p2, size_t num)
{
assert(p1 && p2);
void * crt = p1;
if (p2 >= p1 || (char*)p1 >= ((char*)p2 + num))
{
while (num--)
{
*(char *)p1 = *(char *)p2;
p1 = (char *)p1 + 1;
p2 = (char *)p2 + 1;
}
}
else
{
while (num--)
{
*(char *)p1 = *(char *)p2;
p1 = (char*)p1 - 1;
p2 = (char*)p2 - 1;
}
}
return(crt);
}
int main()
{
int arr1[20] = {1,2,3,4,5,6,7,8,9};
my_memmove(arr1, arr1+3, 20);
for (int i = 0; i < 20; i++)
{
printf("%d", arr1[i]);
}
return 0;
}
3.memset的使用方法
memset是一个C标准库函数,用于将一块内存区域的值设置为给定的值。
memset函数的原型如下:
void *memset(void *ptr, int value, size_t num);
参数说明:
ptr
:指向要填充的内存块的指针。value
:要设置的值,作为整数传递,但是它在每个字节中被转换为无符号字符。num
:要填充的字节数。
注意事项:
memset
函数仅适用于设置整个字节的值。如果要设置的是其他数据类型(如整型、浮点型等),则需要使用其他方式。memset
函数通常用于初始化数组或清空缓冲区。但是,对指针数组或结构体进行初始化时,最好使用其他方法。
示例用法:
#include <stdio.h>
#include <string.h>
int main() {
char str[50];
strcpy(str, "Hello world!");
printf("Before memset: %s\n", str);
memset(str, '-', 7);
printf("After memset: %s\n", str);
return 0;
}
输出结果:
Before memset: Hello world!
After memset: -------
上述示例使用memset函数将字符串str
的前7个字符设置为连字符-
。
4.memcmp的使用方法
memcmp是一个C库函数,用于比较两个内存块的内容是否相同。
函数签名如下:
int memcmp(const void *ptr1, const void *ptr2, size_t num);
参数说明:
- ptr1: 指向要比较的第一个内存块的指针。
- ptr2: 指向要比较的第二个内存块的指针。
- num: 要比较的字节数。
返回值说明:
- 如果两个内存块相同,则返回0。
- 如果第一个内存块小于第二个内存块,则返回一个负数。
- 如果第一个内存块大于第二个内存块,则返回一个正数。
用法示例:
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "Hello";
char str2[] = "Hello";
char str3[] = "World";
int result1 = memcmp(str1, str2, sizeof(str1));
int result2 = memcmp(str1, str3, sizeof(str1));
if (result1 == 0) {
printf("str1 and str2 are equal\n");
} else {
printf("str1 and str2 are not equal\n");
}
if (result2 == 0) {
printf("str1 and str3 are equal\n");
} else {
printf("str1 and str3 are not equal\n");
}
return 0;
}
输出结果:
str1 and str2 are equal
str1 and str3 are not equal
上述示例中,使用memcmp函数分别比较了str1和str2、str1和str3两个内存块的内容。由于str1和str2相等,所以返回值为0;而str1和str3不相等,返回值不为0。根据返回值可以判断两个内存块的内容是否相同。