ZeroMemory、memset 和“={0}” 用于清零操作的区别
最近在修改程序问题时,发现一个用ZeroMemory的使用问题。ZeroMemory、memset或 “={0}”来对结构体对象进行初始化或清零。然而这三种方式都有各自的特点,使用时需谨慎,否则容易出现严重错误。
ZeroMemory是美国微软公司的软件开发包SDK中的一个宏。 其作用是用0来填充一块内存区域。定义式如下:
#define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))
#define ZeroMemory RtlZeroMemory
memset的原型是:
void *memset(void *s,int ch,size_t n); 是由C Run-time Library提供的提供的函数,作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。由于是语言层面提供,所以可跨平台使用。参考:
http://www.cplusplus.com/reference/cstring/memset/
可见,ZeroMemory实际是用memset实现的,而且只用于Windows平台。ZeroMemory和memset且于清零时,会将结构中所有字节置0,如果结构体中有虚函数或结构体成员中有虚函数,则会将虚函数指针置0,如果后续程序调用虚函数,空指针很可能导致程序崩溃!
因此,有虚函数或成员中有虚函数的结构体初始化,一定要用构造函数来完成。
ZeroMemory、memset 和“={0}” 用于清零操作的区别相关推荐
- ZeroMemory、memset 和 “={0}” 三者用于清零操作的区别
ZeroMemory . memset 和 "={0}" 三者用于清零操作的区别: 首先是ZeroMemory和memset的区别: 1.ZeroMemory是微软的SDK提供 ...
- 打印机清零操作步骤分享!
打印机怎么清零?打印机在使用一段时间过后,可能会留下很多打印记录和缓存,影响正常使用,这时候就要对它实行清零操作了.那么打印机怎么清零呢,其实不同品牌不太一样. 方法一: 1.首先我们打开打印机的前盖 ...
- 8位寄存器置位与清零操作
对寄存器A的第四位进行置位操作,1<<4, A=A|(1<<4). 对寄存器A的第四位进行清零操作,1<<4,A=A&~(1<<4). 置位与清 ...
- 对结构体变量进行清零操作
自己为了省事,往往习惯对结构体变量清零时,直接在定义时赋值,比如如下: struct tls_cmd_key_t { u8 format; u8 index; u8 key_l ...
- 8.裸板--C语言下的寄存器的读写置位清零操作
从CPU的角度来看,外设的寄存器跟通用寄存器操作一样,对它们的地址进行读写移位等操作即可进行配置读取写入等动作. 通用寄存器有15个 寄存器名字 Reg# APCS 意义 R0 a1 工作寄存器 R1 ...
- 同步电路出现异步清零可以吗_异步清零和同步清零置数区别
[相关知识]:中规模集成计数器的功能表阅读.反馈清零法和反馈置数法的应用等.本文引用地址:http://www.eepw.com.cn/article/201610/311031.htm [解题方法] ...
- ZeroMemory、memset 和 “={0}” 三者区别
ZeroMemory.memset 和 "={0}" 三者用于清零操作的区别: 首先是ZeroMemory和memset的区别: 1.ZeroMemory是微软的SDK提供的,me ...
- ZeroMemory、memset 和 “={0}”的联系与区别
ZeroMemory.memset 和 "={0}" 三者用于清零操作的区别: 首先是ZeroMemory和memset的区别: 1.ZeroMemory是微软的SDK提供的,me ...
- Zeromemory memset
1. void ZeroMemory( PVOID Destination, SIZE_T Length); Destination :指向一块准备用0来填充的内存区域的开始地址. Length :准 ...
最新文章
- INSTALL_FAILED_VERSION_DOWNGRADE
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:新版本说明
- python-mysql的安装和基本操作
- 一个由进程内存布局异常引起的问题
- Server-Side UI Automation Provider - WinForm Sample
- python数据结构与算法(13)
- argparse--解析命令行选项、用法以及说明
- spring—SpringMVC的请求和响应
- hill密码源代码c语言,古典密码(Hill加密算法)(示例代码)
- CSS3 盒阴影 box-shadow属性
- linux内核发包工具,Linux内核发包工具pktgen测试方案说明
- CAT - 监控平台之装配篇
- activiti7关联mysql_学习笔记:一个MySQL实例有多个Activiti数据库问题
- 看雪学院荣获TSRC 2018年度峰会优秀合作伙伴
- vscode中自动修复eslint的项目语法错误
- oracle双机热备份方法(转)
- GIS地图布局设置总结
- 看门狗性能软件测试,《看门狗:军团》PC版性能表现分析
- 【零信任落地案例】吉大正元某大型集团公司零信任实践案例
- Octapharma Group公布强劲的2018年业绩