您的位置:首页 > 其它

mem家族(memset和memcpy)

2016-03-10 17:36 281 查看

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来初始化的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: