常见的内存函数有四个:
1.memcpy
2.memcmp
3.memmove
4.memset
函数的介绍:
一、 第一个函数memcpy:
memcpy是一个内存拷贝函数,跟字符串中的strcpy功能相似,strcpy函数只能对字符串进行拷贝操作,而memcpy函数可以拷贝内存中的数据,对数据的类型没有限制;
void * memcpy ( void * destination, const void * source, size_t num );
#include<string.h>
模拟实现memcpy函数:
在模拟实现之前我们首先讲一下void*类型,void*类型是无具体类型的指针,属于通用类型可以接受任何类型的指针但是此类指针我们不能进行解引用和自增自减操作,在使用此类指针之前我们必须先强制类型转换成我们需要的类型;
#include <stdio.h>
#include <assert.h>
void* my_memcpy(void* dest, const void* src, size_t num)
{
assert(dest && src);//断言传过来的dest和src是否为空指针;
void* ret = dest;//创建一个void*类型的指针保存dest用于返回;
//由于我们不知道未来我们要拷贝什么类型的数据所以我们进行一个字节一个字节的拷贝
while (num--)
{
*((char*)dest)++ = *((char*)src)++;//由于参数的类型是void*类型的指针我们首先要进行强制类型转换,但是强制类型转换是临时的我们需要用括号括起来;
}
return ret;
}
int main()
{
int arr[] = { 1,3,4,5,4,7,9,0 };
int brr[20] = { 0 };
int* p = (int *)my_memcpy(brr, arr, 24);//进行传参;
for (int i = 0; i < 6; i++)
{
printf("%d ", *(p + i));//
}
return 0;
}
运行结果:
注意:memcpy函数再有些编译器中只能实现不重叠拷贝,而在VS中memcpy函数既可以实现拷贝不重叠,也可以拷贝重叠内存;不能拷贝越界的情况;
二、 第二个函数memcmp
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
函数的作用:比较两个内存块:将 ptr1 指向的内存块的前 num 字节数与 ptr2 指向的第一个字节数进行比较,如果它们都匹配,则返回零,如果不匹配,则返回一个不同于零的值,表示哪个值更大。 请注意,与 strcmp 不同,该函数在找到空字符后不会停止比较。
<0 | 两个内存块中不匹配的第一个字节在 ptr1 中的值低于 ptr2中的值 |
0 | 两个内存块的内容相等 |
>0 | 两个内存块中不匹配的第一个字节在 ptr1中的值大于在 ptr2 中的值 |
#include<string.h>
使用memcmp函数
#include<stdio.h>
#include<string.h>
int main()
{
int arr1[] = { 1,2,3,4,7};//01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 07 00 00 00
int arr2[] = { 1,2,3,4,6};//01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 06 00 00 00
int ret = memcmp(arr1, arr2, 17);
printf("%d\n", ret);
return 0;
}
三、 第三个函数memmove
void * memmove ( void * destination, const void * source, size_t num );
size_t 是无符号整数类型。
#include<string.h>
模拟实现memmove函数:
分析部分:
代码实现:
#include<stdio.h>
#include <assert.h>
void* my_memmove(void* dest, const void* src, size_t num)
{
assert(dest && src);//断言
void* ret = dest;//保存一份指向目标空间的指针,返回时用
if (src < dest)//判断src和dest的位置关系,来决定以什么方式进行复制
{
//后->前
while (num--)
{
*((char*)dest + num) = *((char*)src + num);//从最后一个字节向前复制;
}
}
else
{
//前->后
while (num--)
{
*((char*)dest)++ = *((char*)src)++;
}
}
return ret;
}
int main()
{
int arr[20] = { 1,2,3,4,5,6,7,8,9 };
my_memmove(arr + 3, arr, 24);
for (int i = 0; i < 9; i++)//将复制完的arr进行打印;
{
printf("%d ", arr[i]);
}
return 0;
}
运行结果:
四、 第四个函数memset
void * memset ( void * ptr, int value, size_t num );
size_t 是无符号整数类型。
#include<string.h>
使用memset函数:
#include<stdio.h>
#include <string.h>
int main()
{
char arr[] = "hello world";
memset(arr, 'x', 5);
printf("%s\n", arr);
return 0;
}
运行结果:
注意:memset函数设置内存时是以字节为单位设置的;
#include<stdio.h>
#include <string.h>
int main()
{
int arr[10] = { 0 };
//01 01 01 01
memset(arr, 1, sizeof(arr));//这种写法无法将数据的每个元素设置为1,而是把每个字节设置为了1
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%p ", arr[i]);
}
return 0;
}
以上就是内存函数的部分的内容!