一些内存函数的理解

一些常见的内存函数以及实现

memcpy

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

这是该函数的使用方式

几点需要注意的:

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

2.这个函数在遇到 \0 的时候并不会停下来。

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

重叠需要出门左转找memmove

//memcpy 模拟实现   //以字节为单位

#include<stdio.h>

#include<assert.h>

#include<string.h>

void* memcpy1(void* aim,const void* copy,size_t p1)

{

assert(aim&&copy);

void* back = aim;

int i = 0;

for (i = 0; i < p1; i++)

{

*(char*)aim = *(char*)copy;

aim = (char*)aim + 1;    //错误示范:*(char*)aim++;

copy = (char*)copy + 1;     

}

return  back;

}

int main()

{

int arr1[] = { 1,2,3,4,5,6};

int arr2[10] = { 0 };

int arr3[] = { 1, 1, 1, 1, 1  };

int arr4[10] = { 0 };

memcpy(arr2,arr1,24);

memcpy1(arr4, arr3, 20);

printf("库函数:\n");

for (int i = 0; i < sizeof(arr2) / sizeof(arr2[0]); i++)

{

printf("%d ", arr2[i]);

}

printf("\n");

printf("模拟函数:\n");

for (int i = 0; i < sizeof(arr4) / sizeof(arr4[0]); i++)

{

printf("%d ", arr4[i]);

}

printf("\n");

return 0;

}

memmove

使用方式:void * memmove ( void * destination, const void * source, size_t num ); 

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

 2.如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。

memmove 模拟实现  //从前向后复制还是从后向前复制 分清很重要

//         //以字节为单位

//                 //目标              //不想被更改的来源    //类型

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

//

#include<stdio.h>

#include<assert.h>

#include<string.h>

void* memmove1(void* aim,const void* source,size_t n)

{

assert(aim&&source);

void* returner = aim;  //要模拟就模拟到底

//分俩情况,看num是在aim前面还是后面

if (source<aim)   //在前面,倒着来

{

while (n--)

{

 *((char*)aim+ n) = *((char*)source + n);

}

}

if (source>=aim)  //在后面,正着来

{

while (n--)

{

*(char*)aim = *(char*)source;

aim = (char*)aim + 1;

source = (char*)source + 1;

}

}

return returner;

}

int main()

{

int arr1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

int arr2[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

memmove(arr1+2,arr1,5*sizeof(int));

memmove1(arr2+2, arr2, 5 * sizeof(int));

printf("库函数结果\n");

for (int i = 0; i < 10; i++)

{

printf("%d ", arr1[i]);

}

printf("\n");

printf("模拟实现函数结果\n");

for (int i = 0; i < 10; i++)

{

printf("%d ", arr2[i]);

}

printf("\n");

return 0;

}

Memset

使用方法:void * memset ( void * ptr, int value, size_t num );

这函数是用来设置内存的,把内存中的值以字节单位设置成想要的内容

#include <stdio.h>

#include <string.h>

int main ()

{

char str1[] = "hello world";

memset (str1,a,6);   //意思就是把前六个字节里的内容设置为a

printf(str);

return 0;

}

此函数模拟实现比较简单,可以用类似memcpy模拟实现的思路来

Memcmp

使用方法:int memcmp ( const void * ptr1, const void * ptr2, size_t num );

这个函数类似strcmp,模拟实现也可以用类似的思路去完成

这些是比较常见的内存函数,对前俩进行较为深入的理解,并且模拟实现,对进一步理解内存有益

如有错误,敬请指正

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值