6 内存操作函数
今天来讲一下内存操作函数,与字符串的操作函数类似。在字符串函数中有字符串拷贝(strcpy),字符串比较(strcmp),那么在内存操作函数中,同样也有类似的操作函数,那么接下来我们就来看看这些内存操作函数如何去使用吧。
6.1 memcpy - 内存拷贝函数(不重叠)
6.1.1 函数原型
void *memcpy( void *dest, const void *src, size_t count );
memcpy函数的第一个参数dest是目标缓冲区,也就是你想要将复制的内存放到哪个内存变量里;第二个参数src就是需要复制的内容;第三个参数是在第二个参数里选取count个字节来复制内容。
6.1.2 注意
memcpy函数应该拷贝的是不重叠的内存,也就是说目标指针不能使用原来的指针。(而在VS编译器中既可以拷贝不重叠的内存,也可以拷贝重叠的内存)
6.1.3 函数使用样例
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* dest, const void* src, int num)
{
void* ret = dest;
assert(dest && src);
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
//(目标,来源,拷贝的字节数)
my_memcpy(arr2, arr1, 20);
int i = 0;
for (i = 0; i < 10; i++)
printf("%d ", arr2[i]);
return 0;
}
代码执行结果:
6.2 memmove - 内存拷贝函数(重叠)
6.2.1 函数原型
void *memmove( void *dest, const void *src, size_t count );
memmove函数的第一个参数dest是目标缓冲区,也就是你想要将复制的内存放到哪个内存变量里;第二个参数src就是需要复制的内容;第三个参数是在第二个参数里选取count个字节来复制内容
6.2.2 注意
看完memmove函数之后,是不是觉得这跟memcpy没什么两样?怎么连形参都是一样的呢?确实,memmove函数就是在memcpy的基础上,优化了可以处理内存重叠的情况。
6.2.3 函数使用样例
#include<stdio.h>
#include<assert.h>
void* my_memmove(void* dest, const void* src, int num)
{
assert(dest && src);
void* ret = dest;
if (dest < src)
{
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
while (num--)
{
*((char*)dest+num) = *((char*)src+num);
}
}
return ret;
}
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
//(目标,来源,拷贝的字节数)
my_memmove(arr1+2, arr1, 20);
int i = 0;
for (i = 0; i < 10; i++)
printf("%d ", arr1[i]);
//1 2 1 2 3 4 5 8 9 10
return 0;
}
代码执行结果:
6.3 memcmp - 内存比较函数
6.3.1 函数原型
int memcmp( const void * buf1 , const void * buf2 , size_t count );
memcmp函数前两个参数是需要比较大小的内存指针,第三个参数是需要比较的字节数,最后并返回一个int型。
1.buf1 < buf2 --> return int ( < 0 )
2.buf1 = buf2 --> return int ( = 0 )
3.buf1 > buf2 --> return int ( > 0 )
6.3.2 注意
memcmp函数的头文件是string.h或memeory.h;与字符串比较函数类似,返回整型。
6.3.3 函数使用样例
#include<stdio.h>
int main()
{
float arr1[] = { 1.0,2.0,3.0,4.0 };
float arr2[] = { 1.0,3.0 };
int ret1 = memcmp(arr1, arr2, 4);//0
int ret2 = memcmp(arr1, arr2, 8);//-1
printf("%d\t%d", ret1, ret2);
return 0;
}
代码执行结果:
6.4 memset - 内存设置函数
6.4.1 函数原型
void *memset( void * dest , int c , size_t count );
memset函数的第一个参数是需要被初始化的内存指针,第二个参数是需要对内存初始化成什么整型值,第三个参数则是内存需要初始化的字节数。
6.4.2 注意
初始化的内存可以是任意类型,字节数是该内存的大小。
6.4.3 函数使用样例
#include<stdio.h>
#include<string.h>
int main()
{
int arr[10] = { 0 };
memset(arr, 1, 20);
//(对象,赋值,字节数)
return 0;
}
代码执行可在调试中观察。