1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > memcpy/memset函数的c语言实现

memcpy/memset函数的c语言实现

时间:2020-05-11 20:13:23

相关推荐

memcpy/memset函数的c语言实现

转载:/u011118276/article/details/46742341

1、memcpy

头文件:#include <string.h>

函数原型:void *memcpy(void *dest, const void *src, size_t n)

功能:将指针src指向的内存空间的n个字节复制到dest指针指向的内存空间

参数:src 为原内容内存的起始地址,dest为复制到目标地址的起始地址

返回值:目标dest内存的起始地址

注意:1、内存空间不能够有重叠;

2、memcpy对于需要复制的内容没有限制,因此用途更广;

3、很明确的是memcpy是将 n个字节, 虽然memcpy对复制的内容完全没有任何的限制,比如数组,结构体等特殊的结构,如果你想将整个结构体变量的内容复制到dest内存区,最好使用sizeof将要复制的内容的完整大小求出来赋值给n,以保持复制的完整性;

c代码:

[cpp]view plaincopyvoid*memCpy(void*dest,constvoid*src,size_tn) { if(NULL==dest||NULL==src||n<0) returnNULL; char*tempDest=(char*)dest; char*tempSrc=(char*)src; while(n-->0) *tempDest++=*tempSrc++; returndest; }

2、memset

头文件:#include <string.h>

函数原型:void *memset(void *s, int c, size_t n)

功能:以s为起始位置的n个字节的内存区域用整数c进行填充

参数:s为内存区域的起始位置,c为要填充的字符,n为要填充多少个字节

返回值:目标s内存的起始地址

注意:1、n表示的是字节数,函数是以字节的形式每次赋值给目标地址;

2、memset函数也是以字节为单位进行赋值的,所以要想在整形数组中给每一位赋确定的非0值,一般来讲是不可行的;(下方将有对此说明测试的程序)

c代码:

[cpp]view plaincopyvoid*memSet(void*s,intc,size_tn) { if(NULL==s||n<0) returnNULL; char*tmpS=(char*)s; while(n-->0) *tmpS++=c; returns; }

下面是针对注意事项的测试程序: [cpp]view plaincopy#include<stdio.h> #include<string.h> void*memSet(void*s,intc,size_tn) { if(NULL==s||n<0) returnNULL; char*tmpS=(char*)s; while(n-->0) *tmpS++=c; returns; } intmain() { intbuf[10]; inti; printf("%d\n",sizeofbuf); for(i=0;i<10;i++) printf("buf[%d]=%d\n",i,buf[i]); printf("------------------------------------\n"); memSet(buf,1,sizeof(buf)); for(i=0;i<10;i++) printf("buf[%d]=%d\n",i,buf[i]); return0; }

结果:

结果分析:可以看出得出的结果并没有得到想要的1,而得出不知道是什么的东西;

1的二进制表示是:0000 0000 0000 0000 0000 0000 0000 0001

memset函数也是以字节为单位进行赋值的,指针每次只会向后移动一个字节,依此将值赋给每次的地址中,直到n = 0;

最后在四个字节中赋值的结果为:0000 00010000 00010000 00010000 0001

十进制显示就为:16843009

当把数组改成char buf[10]时,显示的结果如下:(更加证明是以字节方式赋值)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。