1. void *memset(void *s,int c,size_t n)
总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。
2. 例子
#include<iostream> using namespace std; int main(void){ char s[]="Golden Global View"; //若写成char *s="Golden Global View",报错"Access violation writing location 0x00e7580c." //这是因为*s指针指向的字符串常量在内存空间的常量区,它不能修改;若定义为s[]则会在栈上分配 //空间,可以修改。 memset(s,'G',6); printf("%s",s); system("pause"); return 0; }
3. memset() 函数常用于内存空间初始化。如:
char str[100];
memset(str,0,100);
4. memset()的深刻内涵:用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;例:char a[100];memset(a, '/0', sizeof(a));
memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度。
例:char a[100],b[50]; memcpy(b, a, sizeof(b));拷贝a数组中长度为sizeof(b)的字节 到 b数组
注意如用sizeof(a),会造成b的内存地址溢出。
strcpy就只能拷贝字符串了,它遇到'/0'就结束拷贝。
例:char a[100],b[50]; strcpy(a,b);
如用strcpy(b,a),要注意a中的字符串长度(第一个‘/0’之前)是否超过50位,如超过,则会造成b的内存地址溢出。
5.补充:一点心得
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函数详细说明>: http://blog.csdn.net/yangsen2016/article/details/1638503
6. 对于int数组(一维或者二维) ,memset()只能赋予某些值 ,不是全部值!
Sam已经证明可以对二维数组进行memset,千真万确没有一点问题!
#include<iostream> using namespace std; int main(void){ //C++中用memset, //1. 可以赋予int数组0,-1;可以赋bool数组为true,false;可以赋予char数组任何单个字符。其他不好说 // 因为int型的0二进制为:00...0 ; int型的1二进制为:11...1 //2. sizeof()对于一维、二维数组都好使! int map[5][5]; memset(map,-1,sizeof(map)); printf("%d\n",sizeof(map)); for(int i=0;i<5;i++){ for(int j=0;j<5;j++){ printf("%d\t",map[i][j]); } printf("\n"); } int arr[10]; printf("%d\n",sizeof(arr)); memset(arr,0,sizeof(arr)); for(int i=0;i<10;i++) printf("%d\t",arr[i]); printf("\n"); ///////////////////////////////////////////////////////////////////////////////////////////// char map2[5][5]; memset(map2,'%',sizeof(map2)); printf("%d\n",sizeof(map2)); for(int i=0;i<5;i++){ for(int j=0;j<5;j++){ printf("%c\t",map2[i][j]); } printf("\n"); } system("pause"); return 0; }
转自:http://www.cnblogs.com/xmxu/archive/2012/08/20/2647382.html
1. strcpy函数:顾名思义字符串复制函数:原型:extern char *strcpy(char *dest,char *src); 功能:把从src地址开始且含有NULL结束符的字符串赋值到以dest开始的地址空间,返回dest(地址中存储的为复制后的新值)。要求:src和 dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
一般函数原型实现方式:
char * strcpy(char * strDest,const char * strSrc)
{
char * strDestCopy=strDest; //[3]
if ((strDest==NULL)||(strSrc==NULL)) //[1]
throw "Invalid argument(s)"; //[2]
while ((*strDest++=*strSrc++)!='\0'); //[4]
return strDestCopy;
}
该函数的参数是字符指针,也就是可以是字符串变量和字符数组,因为它们的变量名代表首字符地址。字符串默认有一个null结束符,字符数组没有。所以此 处需要注意:因为src要求有null结束符,所以字符数组的长度必须大于等于src包含null结束符的总长度。例如,char* src="abcd"; char dest[5]; 这里dest的长度就至少为5。
2. strncpy函数:多个n代表可以指定字符个数进行赋值。原型:char * strncpy(char *dest, char *src, size_tn); 功能:将字符串src中最多n个字符复制到字符数组dest中(它并不像strcpy一样遇到NULL才停止复制,而是等凑够n个字符才开始复制),返回 指向dest的指针。要求:如果n > dest串长度,dest栈空间溢出产生崩溃异常。该函数注意的地方和strcpy类似,但是n值需特别注意,
1)src串长度<=dest串长度,(这里的串长度包含串尾NULL字符)
如果n=(0, src串长度),src的前n个字符复制到dest中。但是由于没有NULL字符,所以直接访问dest串会发生栈溢出的异常情况。这时,一般建议采取 memset将dest的全部元素用null填充,如:memset(dest,0,7)(7为从dest起始地址开始前7个位置填充null,dest 可以为字符指针和数组名)。注意:char* pc="abc"; char chs[5]; sizeof(pc)为4(包含null)(有些编译器不行),sizeof(chs)为5。
如果n = src串长度,与strcpy一致。
如果n = dest串长度,[0,src串长度]处存放于desk字串,(src串长度, dest串长度]处存放NULL。
2)src串长度>dest串长度
如果n =dest串长度,则dest串没有NULL字符,会导致输出会有乱码。如果不考虑src串复制完整性,可以将dest最后一字符置为NULL。
所以,一般把n设为dest(含null)的长度(除非将多个src复制到dest中)。当2)中n=dest串长度时,定义dest为字符数组,因为这时没有null字符拷贝。