1>memset:
1、 头文件:#include <memory.h>
功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,
块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作
用 法: void *memset(void *s, char ch, unsigned n);
2、memset() 函数常用于内存空间初始化。如:
char str[100];
memset(str,0,100);
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);
3、例子
main(){
char *s="Golden Global View";//你这里的s志向的是一段只读的内存,而你memset又试图修改它,所以运行时要出错,修改办法char *s修改为char s[]
clrscr();
memset(s,'G',6);//貌似这里有点问题//
printf("%s",s);
getchar();
return 0;
}
【这个问题相当大,程序根本就运行不下去了,你这里的S志向的是一段只读的内存,而你memset又试图修改它,所以运行时要出错,修改办法char *s修改为char s[]】
2>memcpy:
函数原型:void memcpy(void dest, void src, unsigned int count);
1、memcpy 函数用于把资源内存(src所指向的内存区域)拷贝到目标内存(dest所指向的内存区域);拷贝多少个?有一个size变量控制拷贝的字节数;
用法:(1)可以拷贝任何类型的对象,因为函数的参数类型是void(未定义类型指针),也就是说传进去的实参可以是int,short,char等等,但是由于函数拷贝的过程是一个字节一个字节的拷贝的,所以实际操作的时候要把void强制转化为char*,这样在指针加的时候才会保证每次加一个字节。
memcpy并不是遇到'\0'就结束,而是一定会拷贝完n个字节。
memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;
例:
char a[100], b[50];
memcpy(b, a,sizeof(b)); //注意如用sizeof(a),会造成b的内存地址溢出。
注意事项:(1)void* 一定要返回一个值(指针),这个和void不太一样!
(2)首先要判断指针的值不能为空,desc为空的话肯定不能拷贝内存空间,src为空相当于没有拷贝;所以之间return掉;
(3)" " 空串是指内容为0,NULL是0,不是串;两个不等价;
(4)int dest[2] = {0};这是对int 类型的数组初始化的方法;如果是char类型,就用char a[5] = "1234"; 注意数组下标要
多于实际看到的字符数,因为还有'\0'
(5)printf((char *)dest);这句话,是把 char 类型 src 传到 int 类型的 dest的内存强制转化成char类型,然后打印出来;
因为直接看int类型的dest是看不到里面的内容的;因为有unsigned char *desc1 = (unsigned char*)desc;所以字符可以传
到dest里面保存起来,dest所指向的内存长度4个字节,强制转化为char 就是把四个字节分成一个一个的字节,这样就可以看到一个个字符了,如果定义成char dest[5] = "1234";就不用转化;呵呵,表达起来真累人;
(6)memcpy1(dest,src,sizeof(src));注意里面的sizeof(src),这个是包括字符串的结束符'/0'的;所以不用担心printf(dest);
但是如果用memcpy1(dest,src,4);没有'/0'就要*(dest+5) = '\0';这样保证是一个完整的字符串;
(7)如果初始化的时候:****字符串的'\0'问题一定要注意啊!!!****
char dest[1024] = "12345666";//{0};
const char src[5] = "3333";
那么拷贝的时候,如果用memcpy(dest,src,sizeof(src));则printf(dest);出来是3333
如果memcpy(dest,src,4);则printf(dest);出来是33335666;因为上面的sizeof(src),包含'\0',所以拷贝过去的字符串以'\0'结束,就只有3333,而如果传4个字符,'/0'是第五个字符,那就遇到dest[1024] 的'/0'结束,所以是33335666
3>strcpy:
原型:extern char *strcpy(char *dest,char *src);
用法:#include<string.h>
功能:把src所指由NULL结束的字符串复制到dest所指的数组中。
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回:指向dest的指针。
注意:
strcpy就只能拷贝字符串了,它遇到'\0'就结束拷贝;例:
char a[100], b[50];
strcpy(a,b);
4>strncpy:
strncpy函数
char *strncpy(char *s2, const char *s1, size_t n);
说明:
函数strncpy从s1指向的数组中最多复制n个字符(不复制空字符后面的字符)到s2指向的数组中。如果复制发生在两个重叠的对象中,则这种行为未定义。
如果s1指向的数组是一个比n短的字符串,则在s2定义的数组后面补空字符,直到写入了n个字符。
如果n大于s2指向数组的字符串大小,则会造成s2的内存地址溢出。例如:
char s2[10], s1[50];
strncpy(s2,s1,sizeof(s1));
返回值:函数返回s2的指针。
strcpy和memcpy主要有以下3方面的区别。
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy