﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Hopes-文章分类-C/C++</title><link>http://www.blogjava.net/Hopes/category/52575.html</link><description>Start Here..</description><language>zh-cn</language><lastBuildDate>Sun, 09 Sep 2012 05:59:19 GMT</lastBuildDate><pubDate>Sun, 09 Sep 2012 05:59:19 GMT</pubDate><ttl>60</ttl><item><title>memset</title><link>http://www.blogjava.net/Hopes/articles/387336.html</link><dc:creator>**</dc:creator><author>**</author><pubDate>Sun, 09 Sep 2012 05:57:00 GMT</pubDate><guid>http://www.blogjava.net/Hopes/articles/387336.html</guid><wfw:comment>http://www.blogjava.net/Hopes/comments/387336.html</wfw:comment><comments>http://www.blogjava.net/Hopes/articles/387336.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Hopes/comments/commentRss/387336.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Hopes/services/trackbacks/387336.html</trackback:ping><description><![CDATA[memset使用详解 <br />
<br />
<br />
<br />
功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,<br />
<br />
块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作<br />
<br />
用 法: void *memset(void *s, char ch, unsigned n);<br />
<br />
程序例:<br />
<br />
#include &lt;string.h&gt;<br />
<br />
#include &lt;stdio.h&gt;<br />
<br />
#include &lt;mem.h&gt;<br />
<br />
int main(void)<br />
<br />
{<br />
<br />
char buffer[] = "Hello world\n";<br />
<br />
printf("Buffer before memset: %s\n", buffer);<br />
<br />
memset(buffer, '*', strlen(buffer) );<br />
<br />
printf("Buffer after memset: %s\n", buffer);<br />
<br />
return 0;<br />
<br />
} <br />
<br />
输出结果：<br />
<br />
Buffer before memset: Hello world<br />
<br />
Buffer after memset: ***********<br />
<br />
编译平台：<br />
<br />
Microsoft Visual C++ 6.0<br />
<br />
也不一定就是把内容全部设置为ch指定的ASCII值，而且该处的ch可为int或者其他类型，并不一定要是char类型。例如下面这样：<br />
<br />
int array[5] = {1,4,3,5,2};<br />
<br />
for(int i = 0; i &lt; 5; i++)<br />
<br />
cout&lt;&lt;array&lt;&lt;" ";<br />
<br />
cout&lt;&lt;endl;<br />
<br />
memset(array,0,5*sizeof(int));<br />
<br />
for(int k = 0; k &lt; 5; k++)<br />
<br />
cout&lt;&lt;array[k]&lt;&lt;" ";<br />
<br />
cout&lt;&lt;endl;<br />
<br />
输出的结果就是：1 4 3 5 2<br />
<br />
0 0 0 0 0<br />
<br />
后面的表大小的参数是以字节为单位，所以，对于int或其他的就并不是都乘默认的1（字符型）了。而且不同的机器上int的大小也可能不同，所以最好用sizeof（）。 <br />
<br />
要注意的是，memset是对字节进行操作，所以上述程序如果改为<br />
<br />
int array[5] = {1,4,3,5,2};<br />
<br />
for(int i = 0; i &lt; 5; i++)<br />
<br />
cout&lt;&lt;array&lt;&lt;" ";<br />
<br />
cout&lt;&lt;endl;<br />
<br />
memset(array,1,5*sizeof(int));// 注意 这里与上面的程序不同<br />
<br />
for(int k = 0; k &lt; 5; k++) <br />
<br />
cout&lt;&lt;array[k]&lt;&lt;" ";<br />
<br />
cout&lt;&lt;endl;<br />
<br />
输出的结果就是：1 4 3 5 2<br />
<br />
16843009 16843009 16843009 16843009 16843009<br />
<br />
为什么呢？<br />
<br />
因为memset是以字节为单位就是对array指向的内存的5个字节进行赋 值，每个都用ASCII为1的字符去填充，转为二进制后，1就是00000001,占一个字节。一个INT元素是4字节，合一起就是 1000000010000000100000001，就等于16843009，就完成了对一个INT元素的赋值了。<br />
<br />
所以用memset对非字符型数组赋初值是不可取的！<br />
<br />
楼上说的很对，只是程序执行结果是0 0 0 0；程序不同的地方不在那里。程序如下：<br />
<br />
int array[5] = {1,4,3,5,2};<br />
<br />
for(int i = 0; i &lt; 5; i++)<br />
<br />
cout&lt;&lt;array&lt;&lt;" ";<br />
<br />
cout&lt;&lt;endl;<br />
<br />
memset(array,1,5*sizeof(int)); //这里才是不同的地方<br />
<br />
for(int k = 0; k &lt; 5; k++) //不同不在这里，k=1只是少循环了一次而已<br />
<br />
cout&lt;&lt;array[k]&lt;&lt;" ";<br />
<br />
cout&lt;&lt;endl;<br />
<br />
例如有一个结构体Some x，可以这样清零：<br />
<br />
memset( &amp;x, 0, sizeof(Some) );<br />
<br />
如果是一个结构体的数组Some x[10]，可以这样：<br />
<br />
menset( x, 0, sizeof(Some)*10 );<br />
<br />
<br />
memset函数详细说明<br />
<br />
1。void *memset(void *s,int c,size_t n)<br />
<br />
总的作用：将已开辟内存空间 s 的首 n 个字节的值设为值 c。<br />
<br />
2。例子<br />
<br />
main(){<br />
<br />
char *s="Golden Global View";<br />
<br />
clrscr();<br />
<br />
memset(s,'G',6);//貌似这里有点问题//<br />
<br />
printf("%s",s);<br />
<br />
getchar();<br />
<br />
return 0;<br />
<br />
}　<br />
<br />
【这个问题相当大，程序根本就运行不下去了，你这里的S志向的是一段只读的内存，而你memset又试图修改它，所以运行时要出错，修改办法char *s修改为char s[]】<br />
<br />
3。memset() 函数常用于内存空间初始化。如：<br />
<br />
char str[100];<br />
<br />
memset(str,0,100);<br />
<br />
4。memset()的深刻内涵：用来对一段内存空间全部设置为某个字符，一般用在对定义的字符串进行初始化为&#8216;memset(a, '\0', sizeof(a));<br />
<br />
memcpy用来做内存拷贝，你可以拿它拷贝任何数据类型的对象，可以指定拷贝的数据长度；例：char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a)，会造成b的内存地址溢出。<br />
<br />
strcpy就只能拷贝字符串了，它遇到'\0'就结束拷贝；例：char a[100],b[50];strcpy(a,b);如用strcpy(b,a)，要注意a中的字符串长度（第一个&#8216;\0&#8217;之前）是否超过50位，如超过，则会造成b的内存地址溢出。<br />
<br />
5.补充：某人的一点心得<br />
<br />
memset可以方便的清空一个结构类型的变量或数组。<br />
<br />
如：<br />
<br />
struct sample_struct<br />
<br />
{<br />
<br />
char csName[16];<br />
<br />
int iSeq;<br />
<br />
int iType;<br />
<br />
};<br />
<br />
对于变量<br />
<br />
struct sample_strcut stTest;<br />
<br />
一般情况下，清空stTest的方法：<br />
<br />
stTest.csName[0]='\0';<br />
<br />
stTest.iSeq=0;<br />
<br />
stTest.iType=0;<br />
<br />
用memset就非常方便：<br />
<br />
memset(&amp;stTest,0,sizeof(struct sample_struct));<br />
<br />
如果是数组：<br />
<br />
struct sample_struct TEST[10];<br />
<br />
则<br />
<br />
memset(TEST,0,sizeof(struct sample_struct)*10);<br />
<br />
6。strcpy<br />
<br />
原型：extern char *strcpy(char *dest,char *src);<br />
<br />
用法：＃i nclude<br />
<br />
功能：把src所指由NULL结束的字符串复制到dest所指的数组中。<br />
<br />
说明：src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。<br />
<br />
返回指向dest的指针。<br />
<br />
memcpy<br />
<br />
原型：extern void *memcpy(void *dest, void *src, unsigned int count);<br />
<br />
用法：＃i nclude<br />
<br />
功能：由src所指内存区域复制count个字节到dest所指内存区域。<br />
<br />
说明：src和dest所指内存区域不能重叠，函数返回指向dest的指针。<br />
<br />
memset<br />
<br />
原型：extern void *memset(void *buffer, int c, int count);<br />
<br />
用法：＃i nclude<br />
<br />
功能：把buffer所指内存区域的前count个字节设置成字符c。<br />
<br />
说明：返回指向buffer的指针。<br />
<br />
原文链接：http://baike.baidu.com/view/982208.htm<br />
&lt;====================================================================================================&gt;<br />
<br />
1。void *memset(void *s,int c,size_t n)<br />
总的作用：将已开辟内存空间 s 的首 n 个字节的值设为值 c。<br />
<br />
2。例子<br />
<br />
main(){<br />
char *s="Golden Global View";<br />
<br />
clrscr();<br />
<br />
memset(s,'G',6);//貌似这里有点问题//<br />
printf("%s",s);<br />
<br />
getchar();<br />
return 0;<br />
}　<br />
3。memset() 函数常用于内存空间初始化。如：<br />
char str[100];<br />
memset(str,0,100);<br />
<br />
4。memset()的深刻内涵：用来对一段内存空间全部设置为某个字符，一般用在对定义的字符串进行初始化为&#8216;memset(a, '\0', sizeof(a));<br />
<br />
memcpy用来做内存拷贝，你可以拿它拷贝任何数据类型的对象，可以指定拷贝的数据长度；例：char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a)，会造成b的内存地址溢出。<br />
<br />
strcpy就只能拷贝字符串了，它遇到'\0'就结束拷贝；例：char a[100],b[50];strcpy(a,b);如用strcpy(b,a)，要注意a中的字符串长度（第一个&#8216;\0&#8217;之前）是否超过50位，如超过，则会造成b的内存地址溢出。<br />
<br />
5.补充：某人的一点心得<br />
memset可以方便的清空一个结构类型的变量或数组。<br />
<br />
如：<br />
struct sample_struct<br />
{<br />
char csName[16];<br />
int iSeq;<br />
int iType;<br />
};<br />
<br />
对于变量<br />
struct sample_strcut stTest;<br />
<br />
一般情况下，清空stTest的方法：<br />
stTest.csName[0]='\0';<br />
stTest.iSeq=0;<br />
stTest.iType=0;<br />
<br />
用memset就非常方便：<br />
memset(&amp;stTest,0,sizeof(struct sample_struct));<br />
<br />
如果是数组：<br />
struct sample_struct TEST[10];<br />
则<br />
memset(TEST,0,sizeof(struct sample_struct)*10);<br />
<br />
6。strcpy<br />
原型：extern char *strcpy(char *dest,char *src);<br />
用法：＃i nclude<br />
功能：把src所指由NULL结束的字符串复制到dest所指的数组中。<br />
说明：src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。<br />
返回指向dest的指针。<br />
<br />
<br />
memcpy<br />
原型：extern void *memcpy(void *dest, void *src, unsigned int count);<br />
用法：＃i nclude<br />
功能：由src所指内存区域复制count个字节到dest所指内存区域。<br />
说明：src和dest所指内存区域不能重叠，函数返回指向dest的指针。<br />
<br />
<br />
<br />
memset<br />
原型：extern void *memset(void *buffer, int c, int count);<br />
用法：＃i nclude<br />
功能：把buffer所指内存区域的前count个字节设置成字符c。<br />
说明：返回指向buffer的指针。<br />
<br />
原文链接：http://www.azure.net.ru/read.php/137.htm
<img src ="http://www.blogjava.net/Hopes/aggbug/387336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Hopes/" target="_blank">**</a> 2012-09-09 13:57 <a href="http://www.blogjava.net/Hopes/articles/387336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>