欢迎光临
我们一直在努力

C语言内存函数

1. memcpy使用和模拟实现

1.1memcpy

函数原型

void * memcpy ( void * destination, const void * source, size_t num );

功能:

1.memcpy 是完成内存块拷⻉的,不关注内存中存放的数据是啥

2.函数 memcpy 从 source 的位置开始向后复制 num 个字节的数据到 destination 指向的内存位置。

3.如果 source 和 destination 有任何的重叠,复制的结果都是未定义的

参数:

destination :指针,指向⽬标空间,拷⻉的数据存放在这⾥

source :指针,指向源空间,要拷⻉的数据从这⾥来

num :要拷贝的数据占据的字节数

返回值:

拷贝完成后,返回⽬标空间的起始地址

代码演示

#include<stdio.h>
#include<string.h>

int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[20] = { 0 };
memcpy(arr2, arr1, 20);
int sz = sizeof(arr2) / sizeof(int);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}

1.2  memcpy的模拟实现

void* my_memcpy(void* destination, void* source, size_t num)
{
void* ret = destination;
while (num–)
{
*(char*)destination = *(char*)source;
destination = (char*)destination + 1;
source = (char*)source + 1;
}
return ret;
}

分析:void*指针需转化成其他类型指针才能操作,char*指针操作1个字节,更加精细化,就是把要拷贝的数据分成多个字节,进行改动。

2. memmove

2.1memmove

函数原型

void * memmove ( void * destination, const void * source, size_t num );

功能:

1.memmove函数也是完成内存块拷⻉的

2.和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。

参数:

destination :指针,指向⽬标空间,拷⻉的数据存放在这⾥

source :指针,指向源空间,要拷⻉的数据从这⾥来

num :要拷⻉的数据占据的字节数

返回值:

拷⻉完成后,返回⽬标空间的起始地址

总结:由于不需要管内存是否重叠,memmove的使用场景,跟加广泛

3.memset

3.1memset

函数原型

void * memset ( void * ptr, int value, size_t num );

功能:

memset 函数是⽤来设置内存块的内容的,将内存中指定⻓度的空间设置为特定的内容。

参数:

ptr :指针,指向要设置的内存空间,也就是存放了要设置的内存空间的起始地址。

value :要设置的值,函数将会把 value 值转换成 unsigned char 的数据进⾏设置的。也就是以字节为单位来设置内存块的。

num :要设置的内存⻓度,单位是字节。

返回值:返回的是要设置的内存空间的起始地址。

代码演示

int main()
{
char arr[] = "hello world";
memset(arr, 'x', 5);
printf("%s", arr);
return 0;
}

总结:当有⼀块内存空间需要设置内容的时候,就可以使⽤memset函数,值得注意的是memset函数对内存 单元的设置是以字节为单位的。

举例

int arr[] = { 1,2,3,4,5 };
memset(arr, 1, 5);
for (int i = 0; i < 5; i++)
{
printf("%d ", arr[i]);
}

原因:由于1的16进制存储为01 00 00 00 memset改动的单位是1个字节,所以1变为01 01 01 01

刚好就图中的16843009

4.memcmp

4.1memcmp

函数原型

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

代码演⽰

int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 1,2,3,40,5 };
int r1 = memcmp(arr1, arr2, 12);
int r2 = memcmp(arr1, arr2, 16);
printf("%d %d", r1,r2);

赞(0)
未经允许不得转载:171主机测评 » C语言内存函数
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址