函数原型

void *memset(void *s,int c,size_t n);

功能

将已开辟内存空间 s 的首 n 个字节的值设为值 c。

头文件

 #include<memory.h> 

1. memset是以字节为单位,初始化内存块。
当初始化一个字节单位的数组时,可以用memset把每个数组单元初始化成任何你想要的值,比如,
 
而在初始化其他基础类型时,则需要注意,比如,
int data[];
memset(data, , sizeof(data)); // right
memset(data, -, sizeof(data)); // right
memset(data, , sizeof(data)); // wrong, data[x] would be 0x0101 instead of 1
2. 当结构体类型中包含指针时,在使用memset初始化时需要小心。
比如如下代码中,
struct Parameters {
int x;
int* p_x;
};
Parameters par;
par.p_x = new int[];
memset(&par, , sizeof(par));
当memset初始化时,并不会初始化p_x指向的int数组单元的值,而会把已经分配过内存的p_x指针本身设置为0,造成内存泄漏。同理,对std::vector等数据类型,显而易见也是不应该使用memset来初始化的。
 
3. 当结构体或类的本身或其基类中存在虚函数时,也需要谨慎使用memset。
这个问题就是在开头项目中发现的问题,如下代码中,
class BaseParameters
{
public:
virtual void reset() {}
}; class MyParameters : public BaseParameters
{
public:
int data[];
int buf[];
}; MyParameters my_pars;
memset(&my_pars, , sizeof(my_pars));
BaseParameters* pars = &my_pars; MyParameters* my = dynamic_cast<MyParameters*>(pars);
程序运行到dynamic_cast时发生异常。原因其实也很容易发现,我们的目的是为了初始化数据结构MyParameters里的data和buf,正常来说需要初始化的内存空间是sizeof(int) * 3 * 2 = 24字节,但是使用memset直接初始化MyParameters类型的数据结构时,sizeof(my_pars)却是28字节,因为为了实现多态机制,C++对有虚函数的对象会包含一个指向虚函数表(V-Table)的指针,当使用memset时,会把该虚函数表的指针也初始化为0,而dynamic_cast也使用RTTI技术,运行时会使用到V-Table,可此时由于与V-Table的链接已经被破坏,导致程序发生异常。

例:

#include<stdio.h>
#include<mem.h> int main(void)
{
int a[];
int b[]; memset(a,,*sizeof(int)); memset(b,,*sizeof(int)); return ;
}
#include<stdio.h>
#include<mem.h> int main(void)
{
char *s="Golden Global View"; clrscr(); memset(s,'G',); printf("%s",s); getchar(); return ;
} 

memset函数使用的更多相关文章

  1. memset函数详解

    语言中memset函数详解(2011-11-16 21:11:02)转载▼标签: 杂谈 分类: 工具相关  功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大 ...

  2. 深入学习 memset 函数

    最近,和同学讨论了一下memset函数,趁着周五空闲做一总结. memset函数最常用的功能就是初始化数组了(主要是置零),如 #include <iostream> #include & ...

  3. strcpy, memcpy, memset函数

    一. strcpy函数 原型声明:char *strcpy(char* dest, const char *src);   头文件:#include <string.h> 和 #inclu ...

  4. memset函数具体说明

    1.void *memset(void *s,int c,size_t n)总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c. 2.样例#include void main(){char ...

  5. C/C++中memset函数

    本文学习参考http://baike.baidu.com/link?url=ZmSyY8ciB_nJt9KM-W2fiEFJrC2mugFsLqRdY2b4pLe8rD_jRXyN7_pj0GBBD2 ...

  6. C语言中的memset函数和数组指针

    代码: #include <iostream> #include <cstring> using namespace std; int main(){ ] = {}; mems ...

  7. memset函数的使用

    void *memset(void *s, int ch, size_t n); 说明:将s中前n个字节 (typedef unsigned int size_t)用 ch 替换并返回 s 关于mem ...

  8. c/c++学习系列之memset()函数

    [转载] memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的: 包含在<string.h>头文件中,可以用它对一片内存空间逐字节进行初始化: 原型为 : void *mems ...

  9. 关于memset函数--赋最大值

    问题起源: 这几天在刷CCF的时候,图论那边经常用到赋最大值,一开始自己一直手工for循环赋值(INT_MAX或者是LONG_LONG_MAX),后来看到别人的代码,发现了一个比较高端的赋值  mem ...

  10. memset函数用法

    1. memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组 c:是赋给buffer的值 cou ...

随机推荐

  1. 获取DOS命令的返回值.

    procedure CheckResult(b: Boolean); begin if not b then raise Exception.Create(SysErrorMessage(GetLas ...

  2. 图像处理笔记(1): bmp文件结构处理与显示

    1.1图和调色板的概念 如今Windows(3.x以及95,98,NT)系列已经成为绝大多数用户使用的操作系统,它比DOS成功的一个重要因素是它可视化的漂亮界面.那么Windows是如何显示图象的呢? ...

  3. SourceTree使用介绍

    SourceTree比命令行更容易操作,能更直观看到发生了什么.但是没有哪一家git图形化软件能完成git的所有操作,封装后的使用也隐藏了git的一些细节,在图形化工具出现一些非常罕见的情况时,还是需 ...

  4. (转)Oracle存储过程基本语法

    本文转载自:http://www.cnblogs.com/hero4china/articles/base_rule_oracle_procedure.html 存储过程 1  CREATE OR R ...

  5. php使用substr中文乱码问题

    周天的时候对网站 https://www.javasec.cn 进行bug修复和功能更新,其中遇到一个比较有意思的小问题: 问题: 网站的置顶推荐中,有文本略缩.但是无论怎么修改最后一个字符始终现实为 ...

  6. C# winform开发

    一处消息死锁分析 最近维护一个工控机上运行的winform程序,我的前任在一个弹出窗口(窗口B)里面调用了ShowDialog方法弹出对话框(窗口C),导致了一个问题是有时关闭窗口C时windows假 ...

  7. GNS3连接虚拟机

      打开GNS3,拖一台路由器和主机   右击主机,选择配置   添加虚拟机的网卡为主机网卡,(选择VM1或VM8)   路由器选择虚拟机网卡连接   打开虚拟机在导航栏找到“虚拟机”-->“设 ...

  8. 四道腾讯的javascript面试题

    今天整理自己的文件夹时,发现了曾经面试腾讯实习生时的被问挂了的面试题,我将它们整理好了供大家借鉴.当时要求的是手写代码.汗啊,我那时弱爆了! 1,将给定数组转换为一个随机数组 Array.protot ...

  9. [原创]Spring Boot + Mybatis 简易使用指南(二)多参数方法支持 与 Joda DateTime类型支持

    前言 今天在开发练习项目时遇到两个mybatis使用问题 第一个问题是mapper方法参数问题,在参数大于一个时,mybatis不会自动识别参数命名 第二个问题是Pojo中使用Joda DateTim ...

  10. CSS秘密花园:多边框

    今天在查询CSS3动画相关资料时偶然发现这个,感觉有时还是挺方便的.原文链接:http://www.w3cplus.com/css3/css-secrets/multiple-borders.html ...