1. mem开头的函数基本上都是对内存操作的,
它们不管内存里放的是什么数据,只要给出长度,它们就操作。不像strcpy、strcmp等函数一定以'\0'结尾,而且是字符。mem可以操作可见字符、不可见字符、控制字符等,任意数据都可以。
2. memcpy是内存复制函数
原型:
void * memcpy(void *dest, void const *src, unsigned intlength);
功能:从src的起始位置复制length个字节到dst的内存起始位置。你可以用这种方法复制任何类型的值,第3个参数指定复制值的长度(以字节计用sizeof())。
如果src和dst以任何形式出现了重叠,它的结果是未定义的。
3. memset函数
原型:
void * memset(void *a, int val, unsignedint length);
功能:把从a开始的length个字节都设置为值val。
例子:memset(buffer, 0, SIZE);
Memcpy详解:
结构如下:void *memcpy(void *dest, const void *src,size_t count);
作用:在dest处拷贝src处的字节,并以count来计算需要拷贝的字节数量,进行内存的拷贝。
参数:dest:新的存贮区的开始部位 src:需要拷贝的开始部位 count:需要拷贝的字节数
备注:dest,src,它们都是从各自的地址处进行写入,如果是p而不是&p,那么奖会取得p的值(地址),在该值的地址处进行读出或写入.
memcpy函数的特点是:
1. 使用memcpy函数前,实参dest必须初始化,否则可能会出错。
2. 函数原理是将void *src 强制转换为char *s,然后只负责拷贝n个字节到dest里,不负责在最后加上'\0'。
strcpy和memcpy主要有以下3方面的区别。
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy
memset详解:
void * memset(void*s, int ch, size_t n);
memset:其实是给一段内存初始化。作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法(注意:memset是以字节为单位,初始化内存块。)
函数解释:将s内存中前n个字节并用 ch 替换,该函数返回 s的指针 。
1.为什么要使用memset清零?答:如果不清空,可能会在测试当中出现野值。
2.memset() 函数常用于内存空间初始化。如:
charstr[100];
memset(str,0,100*sizeof(char));
或
char data[10];
memset(data, 0, sizeof(data)); // right
3. memset可以方便的清空一个结构类型的变量或数组。
如:
structsample_struct{
char csName[16];
int iSeq;
int iType;
};
对于变量:
structsample_strcut stTest;
一般情况下,清空stTest的方法:
stTest.csName[0]='/0';
stTest.iSeq=0;
stTest.iType=0;
用memset就非常方便:
memset(&stTest,0,sizeof(struct sample_struct));
4. 当结构体类型中包含指针时,在使用memset初始化时需要小心。
比如如下代码中,
struct Parameters {
int x;
int* p_x;
};
Parameters par;
par.p_x = new int[10];
memset(&par, 0, sizeof(par));
当memset初始化时,并不会初始化p_x指向的int数组单元的值,而会把已经分配过内存的p_x指针本身设置为0,造成内存泄漏。同理,对std::vector等数据类型,显而易见也是不应该使用memset来初始化的。