memset、memcpy使用陷阱
2011-08-16 20:20
274 查看
void* memset(void *s,int c,size_t n)
作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。
比如:
一、char strtmp[100]; memset(strtmp,0,100);
二、struct sample_struct
{
char csName[16];
int iSeq;
int iType;
};
struct sample_strcut stTest;
一般情况下,清空stTest的方法:
stTest.csName[0]='/0';
stTest.iSeq=0;
stTest.iType=0;
用memset就非常方便:
memset(&stTest,0,sizeof(struct sample_struct));
三、使用陷阱
memset函数是基于bitwise原则的,当要进行操作的对象违反此原则的话,致命的bug将出现。
比如:
class Ctest
{
public:
virtual int getsub();
private:
int a;
int b;
}
Ctest t_a;
memset(&t_a,0,sizeof(Ctest));
这个操作将破坏t_a对象原来的内存数据,导致编译器自动产生的vtbl 值被修改掉;
memcpy也存在同样的问题;
作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。
比如:
一、char strtmp[100]; memset(strtmp,0,100);
二、struct sample_struct
{
char csName[16];
int iSeq;
int iType;
};
struct sample_strcut stTest;
一般情况下,清空stTest的方法:
stTest.csName[0]='/0';
stTest.iSeq=0;
stTest.iType=0;
用memset就非常方便:
memset(&stTest,0,sizeof(struct sample_struct));
三、使用陷阱
memset函数是基于bitwise原则的,当要进行操作的对象违反此原则的话,致命的bug将出现。
比如:
class Ctest
{
public:
virtual int getsub();
private:
int a;
int b;
}
Ctest t_a;
memset(&t_a,0,sizeof(Ctest));
这个操作将破坏t_a对象原来的内存数据,导致编译器自动产生的vtbl 值被修改掉;
memcpy也存在同样的问题;
相关文章推荐
- memset、memcpy使用陷阱
- 与size_t有关的C语言编程失误——memset,memcpy系列函数使用陷阱
- memset、memcpy的使用方法!
- 使用汇编实现memset和memcpy感觉汇编的强大
- memset,memcpy,strcpy函数使用方法
- 关于strcpy、memset、memcpy的使用详解
- 【转】Android 使用NDK开发中,遇到memset,memcpy, malloc函数错误
- 关于strcpy、memset、memcpy的使用详解
- memccpy,memmove,memcpy,memset ,menchr,memcmp,memicmp使用
- 关于strcpy、memset、memcpy的使用详解
- C和指针之字符串memcpy、memmove、memset使用总结
- STL C++ string类不能使用memcpy,memset等一序列内存操作
- strcpy、memset、memmove、memcpy和memccpy函数的使用和区别
- 关于cpp构造函数当中使用memset初始化的陷阱
- memset_memcpy使用
- Android 使用NDK开发中,遇到memset,memcpy, malloc函数错误
- memset,memcpy,strcpy的使用与区别
- c函数之memcpy ,memset,malloc函数使用
- 关于使用memcpy复制的陷阱
- 关于cpp构造函数当中使用memset初始化的陷阱