http://www.cnblogs.com/lebronjames/archive/2010/07/04/1770987.html
void *memset(void *s, int ch, unsigned n);
将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指针。
//========================================================
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
char buffer[] = "Hello World!\n";
printf("Buffer before memset:%s\n", buffer);
memset(buffer, '*', strlen(buffer));
printf("Buffer after memset:%s\n", buffer);
return 0;
}
//=============================================
#include <stdio.h>
#include <string.h>
#define SIZE 5
int main(int argc, char **argv)
{
int i;
int array[SIZE] = { 1, 2, 3, 4, 5 };
for(i = 0; i < SIZE; i++)
{
printf("=before==%d===\n", array[i]);
}
memset(array, 1, SIZE*sizeof(int));
for(i = 0; i < SIZE; i++)
{
printf("=after==%d===\n", array[i]);
}
return 0;
}
输出的结果就是:
1 4 3 5 2
16843009 16843009 16843009 16843009 16843009
因为memset是以字节为单位就是对array指向的内存的5个字节进行赋值,每个都用ASCII为1的字符去填充,转为二进制后,1就是 00000001,占一个字节。一个INT元素是4字节,合一起就是00000001000000010000000100000001,就等于 16843009,就完成了对一个INT元素的赋值了。 所以用memset对非字符型数组赋初值是不可取的!
要注意的是,memset是对字节进行操作
例如有一个结构体Some x,可以这样清零:
memset( &x, 0, sizeof(Some) );
如果是一个结构体的数组Some x[10],可以这样:
memset( x, 0, sizeof(Some)*10 );
//=============================================
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
char buffer[] = "Hello World!\n";
//char *buffer = "Hello World!\n";错误
printf("Buffer before memset:%s\n", buffer);
memset(buffer, '*', 6);
printf("Buffer after memset:%s\n", buffer);
return 0;
}
//========================================================
memset() 函数常用于内存空间初始化。
如:
char str[100];
memset(str,0,100);
memset()的深刻内涵:
用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘memset(a, '\0', sizeof(a));
//=======================================================================
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的内存地址溢出。
//=======================================================================
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);