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来初始化的。
相关文章推荐
- java实现观察者模式
- jQuery---ajax
- ArcGIS RunTime SDK for Android之Features and graphics
- 百度网盘
- 百度地图高级实例1-如何利用【百度地图API】,制作房产酒店地图?(下)
- getSupportFragmentManager()和getChildFragmentManager()
- Android 反编译 -smali语法
- 团队管理的技巧
- 删除所有.svn目录
- Java多线程UDP客户端与服务器间使用Socket通信
- 使用Python读取和写入CSV文件
- Intellij IDEA 14 注册码
- 解决UITableView中Cell重用机制导致内容出错的方法总结
- 百度地图高级实例1-如何利用【百度地图API】,制作房产酒店地图?(中)
- AS Duplicate files copied in APK META-INF/DEPE
- Java 交换两个变量值
- 初试 cmake – cmake的 helloworld
- xib按比例添加约束做屏幕适配探讨(未完)
- WebService学习总结
- openssl 库