一些常见的内存函数以及实现
memcpy
void * memcpy ( void * destination, const void * source, size_t num );
这是该函数的使用方式
几点需要注意的:
1.函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
2.这个函数在遇到 ‘\0’ 的时候并不会停下来。
3.如果source和destination有任何的重叠,复制的结果都是未定义的
重叠需要出门左转找memmove
//memcpy 模拟实现 //以字节为单位
#include<stdio.h>
#include<assert.h>
#include<string.h>
void* memcpy1(void* aim,const void* copy,size_t p1)
{
assert(aim&©);
void* back = aim;
int i = 0;
for (i = 0; i < p1; i++)
{
*(char*)aim = *(char*)copy;
aim = (char*)aim + 1; //错误示范:*(char*)aim++;
copy = (char*)copy + 1;
}
return back;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6};
int arr2[10] = { 0 };
int arr3[] = { 1, 1, 1, 1, 1 };
int arr4[10] = { 0 };
memcpy(arr2,arr1,24);
memcpy1(arr4, arr3, 20);
printf("库函数:\n");
for (int i = 0; i < sizeof(arr2) / sizeof(arr2[0]); i++)
{
printf("%d ", arr2[i]);
}
printf("\n");
printf("模拟函数:\n");
for (int i = 0; i < sizeof(arr4) / sizeof(arr4[0]); i++)
{
printf("%d ", arr4[i]);
}
printf("\n");
return 0;
}
memmove
使用方式:void * memmove ( void * destination, const void * source, size_t num );
1.和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
2.如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。
memmove 模拟实现 //从前向后复制还是从后向前复制 分清很重要
// //以字节为单位
// //目标 //不想被更改的来源 //类型
//void * memmove ( void * destination, const void * source, size_t num );
//
#include<stdio.h>
#include<assert.h>
#include<string.h>
void* memmove1(void* aim,const void* source,size_t n)
{
assert(aim&&source);
void* returner = aim; //要模拟就模拟到底
//分俩情况,看num是在aim前面还是后面
if (source<aim) //在前面,倒着来
{
while (n--)
{
*((char*)aim+ n) = *((char*)source + n);
}
}
if (source>=aim) //在后面,正着来
{
while (n--)
{
*(char*)aim = *(char*)source;
aim = (char*)aim + 1;
source = (char*)source + 1;
}
}
return returner;
}
int main()
{
int arr1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int arr2[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
memmove(arr1+2,arr1,5*sizeof(int));
memmove1(arr2+2, arr2, 5 * sizeof(int));
printf("库函数结果\n");
for (int i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
printf("\n");
printf("模拟实现函数结果\n");
for (int i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
printf("\n");
return 0;
}
Memset
使用方法:void * memset ( void * ptr, int value, size_t num );
这函数是用来设置内存的,把内存中的值以字节单位设置成想要的内容
#include <stdio.h>
#include <string.h>
int main ()
{
char str1[] = "hello world";
memset (str1,a,6); //意思就是把前六个字节里的内容设置为a
printf(str);
return 0;
}
此函数模拟实现比较简单,可以用类似memcpy模拟实现的思路来
Memcmp
使用方法:int memcmp ( const void * ptr1, const void * ptr2, size_t num );
这个函数类似strcmp,模拟实现也可以用类似的思路去完成
这些是比较常见的内存函数,对前俩进行较为深入的理解,并且模拟实现,对进一步理解内存有益
如有错误,敬请指正