目录
内存函数
什么是内存操作函数?
我们认识字符串操作函数(strlen,strcopy等),字符操作函数(tolower等)。这些函数的操作对象都需要符合一种指定类型,比较局限。
而内存操作函数,是通过访问地址的方式操作对象,(不用担心地址存的对象类型),可应用于任何类型的对象。
下面将简单介绍几种常见的内存操作函数。
1.memmcpy
memmcpy,将给定源地址上的内容拷贝到目标地址上,拷贝字节数需自己设定。
void memcopy(void* dest, const void* scr, int count)
{
assert(dest && scr);
while (count--) //共count次,一次一个字节
{
*((char*)dest + count) = *((char*)scr + count); //将源拷贝到目标地
}
}
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[5] = { 0 };
memcopy(arr2,arr1, 20); // 将arr1数组的前20个字节拷贝arr2中
for (int i = 0; i < 5; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
这个函数有一个缺点就是拷贝自身的时候有可能会出现问题。而下一个函数memmove则解决了这个问题。
2.memmove
考虑到拷贝自身时,会出现拷贝到一半,源对象作为某一个目标对象从而被改变,需要分情况选择从前往后还是从后往前拷贝。
arr[10]={0,1,2,3,4,5,6,7,8,9};
memmove(arr+2,arr+4,16);
可以发现,将4,5,6,7拷贝到2,3,4,5的位置:
如果从前往后拷贝,arr[10]={0,1,4,5,6,7,6,7,8,9}; 达到预期目标
如果从后往前拷贝,arr[10]={0,1,6,7,6,7,6,7,8,9};发生错误。
所以函数定义时要考虑拷贝方向。
void* memmove(void* dest, void* scr, int count)
{
assert(dest && scr);
if (dest > scr) //后往前拷贝
{
while (count--)
{
*((char*)dest + count) = *((char*)scr + count);
}
}
else //从前往后拷贝
{
int i = 0;
while (count--)
{
*((char*)dest +i) = *((char*)scr + i);
i++;
}
}
}
int main()
{
int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
memmove(arr + 2, arr, 20);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
3.memcmp
memcmp:从给定地址开始比较对象大小,第三个参数为一共比较的字节数。
下图是一个典型的例子。
4.memset
memsen,内存设置函数。可以设定指定地址里面的内容。
要设定的内容,和要设定的字节个数需自己提供。
例如:
把地址arr往后的20个字节数据,全部改成0。
改变之前,arr往后20个字节存的是
改变之后,arr往后20个字节存的是