/*
* memset函数的坑
* 函数原型:void * memset ( void * ptr, int value, size_t num );
* 函数作用:设置指针所指向的n个字节的内存为指定的值
* ptr : 所指向要被填充的内存块
* value: 需要被设定的值,传入参数为整数,但是实际填充的使用的是unsigned char 转型的值
* num : 多少个字节被设定为该值
*/
#include <iostream>
#include <mem.h>
using namespace std;
int main()
{
//1,初始化基础类型
cout << "Hello world!" << endl;
char data[10];
memset(data,1,sizeof(data));
memset(data,0,sizeof(data));
cout << (int)data[0] << endl;
int data_int[10];
memset(data_int,0,sizeof(data));
memset(data_int,-1,sizeof(data));
memset(data_int,1,sizeof(data)); //wrong ,data[x] would be 0x0101 instead of 1 why?
//因为memset是以字节为单位,初始化内存块
cout << data_int[0] << endl;
//2,初始化结构体
//这里,当memset初始化时,并不会初始化p_x指向的数组单元的值,而会把已经分配过的内存p_x本身
//设置为0,造成内存泄漏。同理对std::vector数据类型,显而易见也是不应该使用memset来初始化的。
struct Parameters{
int x;
int *p_x;
};
Parameters par;
par.p_x = new int[10];
memset(&par, 0, sizeof(par));
//正确写法: memset(par.p_x,0,10)来初始化 p_x所指向的内容
cout << par.p_x[0] << endl;
//当结构体或类的本身或者其基类存在虚函数时,也需要谨慎使用memset
class BaseParameters{
public:
virtual void reset(){}
};
class MyParameters:public BaseParameters
{
public:
int data[3];
int buf[3];
};
MyParameters my_pars;
memset(&my_pars,0,sizeof(my_pars));
BaseParameters *pers = &my_pars;
//程序目的在于将my_pars中的两个数组初始化为0,其大小为4*6 = 24,
//但是由于为了实现虚函数,在类内存开头有一个指针指向虚函数表.
//所以求的的sizeof(my_pars)为28,这就造成将选函数表的指针指向了0.
//那么运行时就出现了错误。
return 0;
}
memset的坑-易错点
最新推荐文章于 2021-10-05 14:24:58 发布