memset的坑-易错点

xiaoxiao2021-02-28  102

/* * 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; }
转载请注明原文地址: https://www.6miu.com/read-39773.html

最新回复(0)