memset,memcpy,strcpy
2011-12-15 13:04
337 查看
作用:对较大的结构体或数组进行清零操作的一种最快方式
1、memset是对字节进行操作,可以用memset可以对字符数组进行赋初值,但不能对非字符型数组赋初值
例如:
①
char ch[20];
memset(ch,0,sizeof(ch));//正确
memset(ch,0,20);//正确,因为字符只占一个字节
②
int num[20];
memset(num,0,sizeof(num));//正确
memset(num,0,20*sizeof(int));//正确
memset(num,1,sizeof(num));//错误,符能对非字符型数组进行赋值
2、清理结构体或结构体数组:
①
Some x;//结构体Some
memset(&x,0,sizeof(Some));
②
Some x[10];//结构体数组
memset(x,0,sizeof(Some)*10);
引用:
memset可以方便的清空一个结构类型的变量或数组。
如:
struct sample_struct
{
char csName[16];
int iSeq;
int iType;
};
对于变量
struct sample_strcut stTest;
一般情况下,清空stTest的方法:
stTest.csName[0]='\0';
stTest.iSeq=0;
stTest.iType=0;
用memset就非常方便:
memset(&stTest,0,sizeof(struct sample_struct));
如果是数组:
struct sample_struct TEST[10];
则
memset(TEST,0,sizeof(struct sample_struct)*10);
另外:
如果结构体中有数组的话还是需要对数组单独进行初始化处理的。
2 Comments
汗,以前一直以为可以
int a[10];
memset(a, 1, sizeof(a));
今天才发现,这是一个天大的错误,自己以前居然没有意识到~~~
事情追溯到今天下午做ACM题,想全部置1,结果发现输出的是怪数字。纳闷之下百度一查,石破天惊~~~
这里把原因说下:
先看了MSDN:
我不明白为何在给出的格式中有int出现,但是Remarks明确指出了:
Sets the first count characters of dest to the character c
其实这都不是重点,重点就是理解为何是这样:
memset是一个字节一个字节的设置.
把一个int的每个字节都设置为1,也就是0×01010101,十进制就是16843009
而在全部置0或者-1就没事。这是因为:
设置为0 就是0×00000000
设置-1就是FF,所以每个字节都置为-1就是0xFFFFFFFF,还是-1。
这也是为何可以置0和置1的原因。
如果想全部置1,只需用for即可。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
memcpy 用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度。
例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),会造成b的内存地址溢出。
Strcpy 就只能拷贝字符串了,它遇到'\0'就结束拷贝。
例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串长度(第一个‘\0’之前)是否超过50位,如超过,则会造成b的内存地址溢出。
str也可以用用个参数的strncpy(a,b,n)
1、memset是对字节进行操作,可以用memset可以对字符数组进行赋初值,但不能对非字符型数组赋初值
例如:
①
char ch[20];
memset(ch,0,sizeof(ch));//正确
memset(ch,0,20);//正确,因为字符只占一个字节
②
int num[20];
memset(num,0,sizeof(num));//正确
memset(num,0,20*sizeof(int));//正确
memset(num,1,sizeof(num));//错误,符能对非字符型数组进行赋值
2、清理结构体或结构体数组:
①
Some x;//结构体Some
memset(&x,0,sizeof(Some));
②
Some x[10];//结构体数组
memset(x,0,sizeof(Some)*10);
引用:
memset可以方便的清空一个结构类型的变量或数组。
如:
struct sample_struct
{
char csName[16];
int iSeq;
int iType;
};
对于变量
struct sample_strcut stTest;
一般情况下,清空stTest的方法:
stTest.csName[0]='\0';
stTest.iSeq=0;
stTest.iType=0;
用memset就非常方便:
memset(&stTest,0,sizeof(struct sample_struct));
如果是数组:
struct sample_struct TEST[10];
则
memset(TEST,0,sizeof(struct sample_struct)*10);
另外:
如果结构体中有数组的话还是需要对数组单独进行初始化处理的。
memset补充:
memset()的错误认识
♠作者:Tanky Woo ¦ Date: 11:07 上午 - 星期六 七月 24 20102 Comments
汗,以前一直以为可以
int a[10];
memset(a, 1, sizeof(a));
今天才发现,这是一个天大的错误,自己以前居然没有意识到~~~
事情追溯到今天下午做ACM题,想全部置1,结果发现输出的是怪数字。纳闷之下百度一查,石破天惊~~~
这里把原因说下:
先看了MSDN:
我不明白为何在给出的格式中有int出现,但是Remarks明确指出了:
Sets the first count characters of dest to the character c
其实这都不是重点,重点就是理解为何是这样:
memset是一个字节一个字节的设置.
把一个int的每个字节都设置为1,也就是0×01010101,十进制就是16843009
而在全部置0或者-1就没事。这是因为:
设置为0 就是0×00000000
设置-1就是FF,所以每个字节都置为-1就是0xFFFFFFFF,还是-1。
这也是为何可以置0和置1的原因。
如果想全部置1,只需用for即可。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
memcpy 用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度。
例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),会造成b的内存地址溢出。
Strcpy 就只能拷贝字符串了,它遇到'\0'就结束拷贝。
例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串长度(第一个‘\0’之前)是否超过50位,如超过,则会造成b的内存地址溢出。
str也可以用用个参数的strncpy(a,b,n)
相关文章推荐
- 函数实现-memcpy-strcpy-memmove-memset
- memset, memcpy, strcpy
- strcpy、memset、memmove、memcpy和memccpy函数的使用和区别
- memset ,memcpy 和strcpy 区别
- C语言库函数(strcpy、strncpy、memcpy、memset)
- Memset、Memcpy、Strcpy 的作用和区别(转)
- strcpy/memcpy/memset/区别解释
- 浅析C++中memset,memcpy,strcpy的区别
- memset ,memcpy 和strcpy 的根本区别?
- strcpy()、memcpy()、memmove()、memset()的实现
- strcpy memcpy strcat strcmp memset strlen
- memset,memcpy,strcpy 的区别
- strcpy,memset,memmove,memcpy的实现
- memset ,memcpy 和strcpy 的根本区别?
- strcpy,memcpy,memset区别
- Memset、Memcpy、Strcpy 的作用和区别(转)
- memmove、memcpy、strcpy、memset的实现
- memset ,memcpy 和strcpy 的区别
- strcpy,memset,memcpy区别
- strcpy()、memcpy()、memmove()、memset()的实现