1.memset函数的用法
- 将缓冲区设置为指定的字符。
- 下面是网上常见的说法,也就是memset函数的用法
函数功能是:将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ASCII值, 第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的指针,它是对较大的结构体或数组进行清零操作的一种最快方法。
头文件是:<memory.h>或<string.h>
- 我今天要探讨的是,memset操作之后,内存中的值变成了什么,真的是我们的期望吗?以便以后放心的写代码。
- vs2008测试代码:
// memset.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <string.h>
struct Test
{
const wchar_t* name;
const wchar_t* password;
int i;
int a[3];
char s[3];
Test(){}
};
int main(int argc, _TCHAR* argv[])
{
Test test;
memset(&test,0,sizeof(test));//设断点
return 0;
}
- 一开始test结构体的值:
- 可以看出来都有默认值
- 使用memset函数之后:
- 可以看出来所有值都被初始化成0,指针初始化为NULL
- 这是最常用的,我上面的例子是struct,显然class也是可以的。那么其它类型的东东可以不可以呢?我们来看看memset函数原型:
void *memset(
void *dest,
int c,
size_t count
);
- 第一个值是void* 类型,我滴妈呀,好东西啊。
- void 指针,就是所谓的通用指针。它是一种特殊的指针,可以指向任意类型的对象。
- 所以它适用于所有类型。
- 现在我们来看一下有趣的事情:把初始化的值变成非0,比如1.
- memset开始前
- memset之后:
- 发现并没有像0一样,这个情况跟我们期望不一样,指针也指向了不受控制的内存,成为野指针,这在程序中可能造成很大错误,而且不宜发现。
2.ZeroMemory
- 和memset功能差不多,但是是windows独有的实现,memset是标准c++库函数
void ZeroMemory(
[in] PVOID Destination,
[in] SIZE_T Length
);
3.总结
- memset这个函数功能强大,但是要初始化要赋值0,不能赋其他值,造成结果不可预知,这样指针也会被赋值为NULL,不会成为野指针,其它类型的对象都会赋成0.
- windows下有ZeroMemory,可以替代。