Memset、Memcpy、Strcpy 的作用和区别

来源:本站
导读:目前正在解读《Memset、Memcpy、Strcpy 的作用和区别》的相关信息,《Memset、Memcpy、Strcpy 的作用和区别》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《Memset、Memcpy、Strcpy 的作用和区别》的详细说明。
简介:本文详细介绍了Memset、Memcpy、Strcpy 的作用及三者的区别,函数原型及使用技巧等。

(1) Memset

原型: extern void *memset(void *buffer, int c, int count);

用法:#include <string.h>

功能: 把buffer所指内存区域的前count个字节设置成字符 c。

说明: 返回指向buffer的指针。用来对一段内存空间全部设置为某个字符

例如:

char a[10];

memset(a, '', sizeof(a));

memset可以方便的清空一个结构类型的变量或数组。

如:struct _test{char s[10];

int x;

int y;

};

变量 struct _test st;

(1)一般清空st的方法如下:

st.s[0] = ''; st.x =0; st.y =0;

(2) 用memset方法如下:

memset(&st,0,sizeof(struct _test));

数组:struct _test st[10];

memset(st,0,sizeof(struct _test)*10);//清空方法

//memset 源码的实现 C语言

#include <mem.h>

void* memset(void* s, int c, size_t n)

{

unsigned char* p = (unsigned char*) s;

while (n > 0)

{

*p++ = (unsigned char) c;

--n;

}

return s;

}

(2)memcpy

原型:extern void *memcpy(void*dest,void*src,unsignedintcount); 用法: #include <string.h>

功能: 由src所指内存区域复制count个字节到dest所指内存区域。

说明: src和dest所指内存区域不能重叠,函数返回指向dest的指针.可以拿它拷贝任何数据类型的对象。

例如:char a[10],b[5];

memcpy(b, a, sizeof(b)); /*注意如果用sizeof(a),会造成b的内存地址溢出*/

(3) Strcpy

原型: extern char *strcpy(char *dest,char *src);

用法: #include <string.h>

功能: 把src所指由NULL结束的字符串复制到dest所指的数组中。

说明: src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳 src的字符串.返回指向dest的指针。

例如: char a[100],b[50];

strcpy(a,b);

如用 strcpy(b,a);

要注意a中的字符串长度(第一个‘’之前)是否超过50位,如超过,则会造成b的内存地址溢出。

假如有如下代码,请问输出为多少?

#include "stdio.h"

main()

{char dest[3];

char str[6]="Hello";

strcpy(dest,str);

printf("%sn",dest);

}

编译输出如下结果:

Hello //没有输出乱码,有点怪怪的为什么?

分析:

1>str中字符串的长度大于dest 的内存长度3.为什么str字符串还能完拷贝到dest 中呢?

来看看 strcpy的 源代码实现:

char *strcpy(char *strDest,const char *strSrc)

{

assert((strDest!=NULL)&&(strSrc !=NULL)) //判断指针是否合法,即分配内存,指向某块确定区域

char *address = strDest; //记住目标地址的起始值

while((*strDest++ = *strSrc++)!='') //先拷贝,后判断,这样就不用在拷贝完了后,再加一句

NULL; // *strDest = ''; -->即加一个结束符.因为字符串结束已拷贝了.

return address; //返回目标首地址的值。

}

//从上面的代码可以看出,strcpy函数,假定strDest的内存空间是足够可以放下strSrc的内容的.

//也就是说使用者,在使用strcpy函数时,应使 (strDest内存空间)>=(strSrc内存空间)

// 在调用 strcpy(dest,str);时,while((*strDest++ = *strSrc++)!='') 没有判断strDest的内存是否够,而是将srtSrc的内容直接拷贝到strDest,当拷到''就结束.

//因此在使用printf("%sn",dest);时 输出遇到''时停此输出.所以会输出: Hello

(4) 三者区别

memset 主要应用是初始化某个内存空间。

memcpy 是用于copy源空间的数据到目的空间中。

strcpy 用于字符串copy,遇到‘’,将结束。

如果理解了这些,就能知道它们的区别:

例如初始化某块空间的时候,用到memcpy,那么就显得笨拙

int m[100]

memset((void*)m,0x00,sizeof(int*100); //Ok!

memcpy((void*)m,"....",sizeof(int)*100); //Not Ok

一.函数原型

strcpy extern char *strcpy(char *dest,char *src);

#include <string.h>

功能:把src所指由NULL结束的字符串复制到dest所指的数组中

说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 返回指向dest的指针

memcpy extern void *memcpy(void *dest,void *src,unsigned int count);

#include <string.h>

功能:由src所指内存区域复制count个字符串到dest所指内存区域.

说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针.

memset extern void *memset(void *buffer,int c,int count);

#include <string.h>

功能:把buffer所指内存区域的前count个字节设置成字符c

说明:返回指向buffer的指针.

二.区别

memset 用来对一段内存空间全部设置为某个字符,一般用于在对定义的字符串初始化为' '或者'';

例: char a[100]; memset(a,'',sizeof(a));

memcpy 是用来做内存拷贝,可以用来拷贝任何数据类型的对象,可以指定拷贝的数据长度;

例: char a[100],b[50];

memcpy(b,a,sizeof(b));

//注意:如果使用sizeof(a),会造成内存溢出

mem是一段内存,他的长度,必须自己记住.memcpy是见着什么拷贝什么。

strcpy 就只能拷贝字符串,它遇到''就结束拷贝;

例:char a[100],b[50]; strcpy(a,b);

如用strcpy(b,a)要注意a中的字符串长度(第一个''之前) 是否超过50,如果超过,则会造成b的 内存溢出.

它是不会拷贝''的,所以一般还有加一个语句: *a='';

三.使用技巧

memset 可以方便的清空一个数据结构的变量或数组.

如: struct sample_struct{

char csName[16];

int iSeq;

int iType;

};

对于变量

struct sample_struct stTest;

一般情况下,初始化stTest的方法:

stTest.csName[0]='';

stTest.iSeq=0;

stTest.iType=0;

而用memset:

memset(&stTest,0,sizeof(struct sample_struct));

如果是数组:

struct sample_struct TEST[100];

memset(TEST,0,sizeof(struct sample_struct)*100);

提醒:《Memset、Memcpy、Strcpy 的作用和区别》最后刷新时间 2024-03-14 00:54:08,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《Memset、Memcpy、Strcpy 的作用和区别》该内容的真实性请自行鉴别。