今天来了解一下C语言的内存函数。
那么C语言中的内存函数都有哪些呢?
memcpy,memmove,memcmp,memset.
问题来了?我们应当如何使用这些函数呢?
接下来看我娓娓道来:
memcpy:
首先我们关注它的函数参数:
原理是这样
我们来实际使用一下
代码如下:
注意:记得调用库函数
#include<string.h>
#include<stdio.h>
#include<string.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6 };
int arr2[10] = { 0 };
memcpy(arr2, arr, 12);
return 0;
}
很轻易我们看到arr2数组由全为零变成前三个数发生改变。
接下来我们如何不利用库函数来完成我们自己的my_memcpy函数呢?
我们很容易想到进行数组交换。、
代码如下:
void* my_memcpy(void* dest, void* sour, size_t n)
{
void* ret = dest;
assert(dest && sour);
while (n--)
{
*(char*)dest = *(char*)sour;
dest = (char*)dest + 1;
sour = (char*)sour + 1;
}
return ret;
}
不出意外的话要出意外了。
我们现在想在一个数组上进行复制。
说干就干。
我们先预想一下结果
代码
#include<stdio.h>
#include<string.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6 };
int arr2[10] = { 0 };
memcpy(arr+2, arr, 16);
return 0;
}
结果会是什么呢?
1 2 1 2 3 4 吗?
结果如下;
为什么会出现这样的事情呢?
void* my_memcpy(void* dest, void* sour, size_t n)
{
void* ret = dest;
assert(dest && sour);
while (n--)
{
*(char*)dest = *(char*)sour;
dest = (char*)dest + 1;
sour = (char*)sour + 1;
}
return ret;
}
所以我们应当注意memcpy和memmove的使用原则:
- memcpy和memmove都是是常用的内存块拷贝函数
- memcpy不提供内存覆盖检测和处理,尝试对源目存在重叠的内存进行拷贝,其行为是不确定的,memcpy不保证源内存重叠区域在被覆盖之前被拷贝
-
对源目存在重叠的内存拷贝的情形,应选用memmove,它提供了对应的检测和处理
2.memmove
memcpy和memmove是内存拷贝的两种不同情况;memcpy不适用于内存重叠的情况,而memmove可以适用。
my_memmove
void* my_memmove(void* dest, void* sour, size_t n)
{
void* ret = dest;
assert(dest && sour);
if (dest < sour)
{
while (n--)
{
*(char*)dest = *(char*)sour;
dest = (char*)dest + 1;
sour = (char*)sour + 1;
}
}
else
{
while (n--)
{
*((char*)dest + n) = *((char*)sour + n);
}
}
return ret;
}
3.memcmp
memcmp和strcmp区别:
strcmp只能应用于字符串,而memcmp不仅可以应用于字符串还可以用于其他场景。
4.memset
设置字符值的函数
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
/*my_memcpy(arr+2, arr, 20);*/
memset(arr, 3, 5);
return 0;
}
今天的内存函数到这里就到尾声了,希望小伙伴们点点关注和赞,有什么也可以一起讨论。