c++中memset给一个struct或class初始化,赋0

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,可以替代。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值