memset /memcpy /strcpy函数的使用与区别
来源:互联网 发布:js面向对象是什么意思 编辑:程序博客网 时间:2024/06/05 10:11
(1) Memset 原型: extern void *memset(void *buffer, int c, int count); 用法: #include <string.h> 功能: 把buffer所指内存区域的前count个字节设置成字符 c。 说明: 返回指向buffer的指针。用来对一段内存空间全部设置为某个字符 例如: char a[10]; memset(a, '/0', sizeof(a)); memset可以方便的清空一个结构类型的变量或数组。 如:struct _test{ char s[10]; int x; int y; }; 变量 struct _test st; (1)一般清空st的方法如下: st.s[0] = '/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> while (n > 0) { return s;
void* memset(void* s, int c, size_t n)
{
unsigned char* p = (unsigned char*) s;
*p++ = (unsigned char) c;
--n;
}
}
(2)memcpy 原型: extern void *memcpy(void *dest, void *src, unsigned int count); 用法: #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中的字符串长度(第一个‘/0’之前)是否超过50位,如超过,则会造成b的内存地址溢出。 假如有如下代码,请问输出为多少? #include "stdio.h" char dest[3]; strcpy(dest,str); } 编译输出如下结果: Hello //没有输出乱码,有点怪怪的 为什么?分析: 1>str中字符串的长度大于dest 的内存长度3.为什么str字符串还能完拷贝到dest 中呢?
main()
{
char str[6]="Hello";
printf("%s/n",dest);
来看看 strcpy的 源代码实现: char *strcpy(char *strDest,const char *strSrc) //从上面的代码可以看出,strcpy函数,假定strDest的内存空间是足够可以放下strSrc的内容的. //也就是说使用者,在使用strcpy函数时,应使 (strDest内存空间)>= (strSrc内存空间) // 在调用 strcpy(dest,str); 时, while((*strDest++ = *strSrc++)!='/0') //没有判断strDest的内存是否够, //而是将srtSrc的内容直接拷贝到strDest,当拷到'/0'就结束. //因此在使用printf("%s/n",dest); 时,输出遇到'/0'时停此输出.所以会输出: Hello
{
assert((strDest!=NULL)&&(strSrc !=NULL)) //判断指针是否合法,即分配内存,指向某块确定区域
char *address = strDest; //记住目标地址的起始值
while((*strDest++ = *strSrc++)!='/0') //先拷贝,后判断,这样就不用在拷贝完了后,再加一句
NULL; // *strDest = '/0'; -->即加一个结束符.因为字符串结束已拷贝了.
return address; //返回目标首地址值.
}
(4) 三者区别 memset 主要应用是初始化某个内存空间。 memcpy 是用于copy源空间的数据到目的空间中。 strcpy 用于字符串copy,遇到‘/0’,将结束。 如果理解了这些,就能知道它们的区别: 例如初始化某块空间的时候,用到memcpy,那么就显得很笨拙了。 int m[100] memset((void*)m,0x00,sizeof(int)*100); //Ok! memcpy((void*)m,"/0/0/0/0....",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 用来对一段内存空间全部设置为某个字符,一般用于在对定义的字符串初始化为' '或者'/0'; 例: char a[100]; memset(a,'/0',sizeof(a)); memcpy 是用来做内存拷贝,可以用来拷贝任何数据类型的对象,可以指定拷贝的数据长度; 例: char a[100],b[50]; memcpy(b,a,sizeof(b)); //注意:如果使用sizeof(a),会造成内存溢出 mem是一段内存,他的长度,必须自己记住.memcpy是见着什么拷贝什么。 strcpy 就只能拷贝字符串,它遇到'/0'就结束拷贝; 例:char a[100],b[50]; strcpy(a,b); 如用strcpy(b,a)要注意a中的字符串长度(第一个'/0'之前) 是否超过50,如果超过,则会造成b的内存溢出. 它是不会拷贝'/0'的,所以一般还有加一个语句: *a='/0'; 三.使用技巧 memset 可以方便的清空一个数据结构的变量或数组. 如: struct sample_struct { char csName[16]; int iSeq; int iType; }; 对于变量 struct sample_struct stTest; 一般情况下,初始化stTest的方法: stTest.csName[0]='/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函数的使用与区别
- memset /memcpy /strcpy函数的使用与区别
- memset /memcpy /strcpy函数的使用与区别
- memset,memcpy,strcpy的使用与区别
- strcpy,memcpy,memset的用法与区别
- memset,memcpy,strcpy 的区别
- memset,memcpy,strcpy 的区别
- memset,memcpy,strcpy 的区别
- memcpy,memset,strcpy的区别
- memset, memcpy, strcpy 的区别
- memset,memcpy,strcpy的区别
- memset,memcpy,strcpy 的区别
- memset,memcpy,strcpy 的区别
- memset,memcpy,strcpy 的区别
- memset,memcpy,strcpy的区别
- memset,memcpy,strcpy 的区别及C字符串函数
- strcpy、memset、memmove、memcpy和memccpy函数的使用和区别
- strcpy,memcpy,memset区别
- ODBC连接字符串怎么写
- 第一篇
- EPICOR 登录
- Java四大名著
- ifream中的js控制外围的代码。JQ
- memset /memcpy /strcpy函数的使用与区别
- 国内顶级中间件开发工具FIX ES2007 架构图
- SQL手动注入
- vb.net 中选择由某个单元格至最下面最后面一个单元格的区域
- 发布Android应用到Google Market上
- NOT EXISTS的另一种写法
- SharePoint 2007:被删除的用户,他的User Profile仍然会被搜索到
- java 保留两位小数
- javascript多级联动select