内存函数
-
- [1.1 内存函数的使用](#1.1 内存函数的使用)
- [1.2 memcpy函数的使用](#1.2 memcpy函数的使用)
- [1.3 memcpy函数的模拟实现](#1.3 memcpy函数的模拟实现)
- [2.1 memmove函数的使用](#2.1 memmove函数的使用)
- [2.2 memmove函数的模拟实现](#2.2 memmove函数的模拟实现)
- [2.3 memcmp函数的使用](#2.3 memcmp函数的使用)
- [2.4 memset函数的使用](#2.4 memset函数的使用)
1.1 内存函数的使用
内存函数就是对内存中的数据进行操作的函数
1.2 memcpy函数的使用
void* memcpy ( void * destination, const void * source, size_t num );
src 往 dest 传递数据的字节数不用来处理重叠的内存之间的数据拷贝
c
#include <stdio.h>
#include <string.h>
#include <assert.h>
void test1()
{
int arr1[] = { 1,2,3,4,5,6,7 };
int arr2[10] = { 0 };
memcpy(arr2, arr1, 28); // 从arr1中拷贝28个字节的数据给到arr1
for (int i = 0; i < 7; i++)
{
printf("%d ",arr1[i]);
}
float arr3[] = { 1.1,2.2,3.3,4.4,5.5,6.6,7.7 };
float arr4[10] = { 0 };
// 可以传递任意类型
memcpy(arr4, arr3, 28);
}
int main()
{
test1();
return 0;
}
1.3 memcpy函数的模拟实现
c
// 返回dest的起始地址
void* my_memcpy(void* dest, const void* src, size_t num)
{
assert(dest && src);
// 记录起始地址
void* ret = dest;
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
2.1 memmove函数的使用
void* memmove ( void* destination, const void* source, size_t num );
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。如果源空间和目标空间出现重叠,就得使用memmove函数处理。
c
void test2()
{
int arr1[] = { 1,2,3,4,5,6,7 };
int arr2[10] = { 0 };
memmove(arr1+2, arr1, 20); // 可以重叠拷贝
for (int i = 0; i < 7; i++)
{
printf("%d ",arr1[i]);
}
}
int main()
{
test2();
return 0;
}
2.2 memmove函数的模拟实现
c
// 返回dest的起始地址
// dest在src之前时,从前往后遍历
// src与dest重叠时,从前往后拷贝数据和从后往前都可以
// dest在src之后时,从后往前遍历
void* my_memmove(void* dest, const void* src, size_t num)
{
assert(dest && src);
// 记录起始位置
int ret = dest;
// 从前往后
if (dest < src)
{
while (num--)
{
*((char*)dest) = *((char*)src);
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
// 从后往前 -> dest >= src
else
{
while (num--)
{
*((char*)dest+num) = *((char*)src + num);
}
}
return ret;
}
2.3 memcmp函数的使用
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
这里比较的是内存中的每个字节中所存储的数的大小
c
#include <stdio.h>
#include <string.h>
int main()
{
// 这里比较的是内存中的每个字节中所存储的数的大小
int arr1[] = { 1,2,3,4 }; // 01 00 00 00 | 02 00 00 00 | 03 00 00 00 | 04 00 00 00
int arr2[] = { 1,3,2 }; // 01 00 00 00 | 03 00 00 00 | 02 00 00 00 | 04 00 00 00
// ^
int ret = memcmp(arr1, arr2, 12);
printf("%d\n",ret);
return 0;
}
2.4 memset函数的使用
memset 内存设置,以字节为单位处理
void* memset( void* dest, 要设置的元素
int value, 要更改的元素
size_t size 更改几个
);
c
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "hello world";
memset(arr, 'x', 5);
//memset(arr+6, 'x', 3); // hello xxxld
printf("%s\n",arr);
return 0;
}