这篇博客将会总结部分C语言内存函数,如memcpy,memmove,memset,memcmp的相关说明
希望可以获得伙伴们的支持!!!
以下将的所有函数使用都要包含头文件<string.h>
目录
1.memcpy
- 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
- 这个函数在遇到 '\0' 的时候并不会停下来。
- source和destination有任何的重叠,复制的结果都是未定义的。
- 目的空间大小一定要能容纳memcpy所拷贝的内容,如果拷贝在内容超过目的空间大小,会导致溢出。
使用举例
可见,这个函数并没有在源字符串后面加' \0 ' ,所以后面的xxxxx还能输出
模拟实现
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* destination, const void* source, size_t num);
int main()
{
int i;
int arr1[20] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[20] = { 11,12,13,14,15,16,17,18,19,20 };
my_memcpy(arr1+2, arr2, 20);
for (i = 0; i < 20; i++)
{
printf("%d ", arr1[i]);
}
printf("\n");
return 0;
}
void* my_memcpy(void* destination, const void* source, size_t num)
{
assert(destination && source);
void* ret = destination;
while (num--)
{
*(char*)destination = *(char*)source;
destination = (char*)destination + 1;
source = (char*)source + 1;
}
return ret;
}
由于复制类型不确定,所以统一强转为最小字节的char类型进行拷贝
2.memmove
- memcpy和memmove很相似,不同于memcpy,memmove函数处理的源内存块和目标内存块是可以重叠的。
- 如果源空间和目标空间出现重叠,就得使用memmove函数处理。
使用举例
模拟实现
#include<stdio.h>
void* my_memmove(void* destination, const void* source, size_t num);
int main()
{
int arr1[20] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr1+3 , arr1, 20);
int i;
for (i = 0; i < 20; i++)
{
printf("%d ", arr1[i]);
}
printf("\n");
return 0;
}
void* my_memmove(void* destination, const void* source, size_t num)
{
void* ret = destination;
if (destination < source)
{
while(num--){
*(char*)destination = *(char*)source;
destination = (char*)destination + 1;
source = (char*)source + 1;
}
}
else {
while (num--) {
*((char*)destination + num) = *((char*)source + num);
}
}
}
这里分为if-else是要考虑目标区域与源区域的前后顺序,以防复制出现问题
3.memset
- memset是用来设置内存的,将内存中的值以字节为单位设置成想要的内容
使用举例
4.memcmp
- 比较从ptr1和ptr2指针指向的位置开始,向后的num个字节
- ptr1>ptr2,返回>0的值
- ptr1<ptr2,返回<0的值
- ptr1=ptr2,返回0