之前有一个程序栽在了memset函数上面,对memset函数一直耿耿于怀,于是想总结一下这个常用但是总出错的函数。

memset在string.h文件中是这么定义的:

void*代表这个函数的返回值可以是任意类型的指针。

_cdecl是C Declaration的缩写,表示C语言默认的函数调用方法。该方法具体为:所有参数从左到右依次入栈,这些参数由调用者清除,称为手动清栈。被调用函数不会调用调用者传递多少参数,调用者传递过多或过少的参数,甚至完全不同的参数都不会产生编译阶段的错误(转自百度百科)。

紫色部分_Out_writes_bytes_all_与 _In_是微软的源代码注释。

第一个参数是任意类型的指针。第二个参数是所赋的值。第三个参数是字节大小。

整个函数的含义就是将_Dst中的前_Size多的字节赋值为_Val,并返回修改后的_Dst。

这里要注意:memset函数中的_size是以字节为单位的。举例:

#include <iostream>
#include <cstring>
using namespace std; int main()
{
char a[5];
memset(a,'v',5); cout<<a[0]<<endl;
cout<<a[1]<<endl;
cout<<a[2]<<endl;
cout<<a[3]<<endl;
cout<<a[4]<<endl; system("pause");
return 0;
}

结果:

memset(a,'v',5);这里的第三个参数直接是5,没有给任何单位,就可以成功将char a[5]成功赋值说明memset是对字符型操作的。

所以说这样的情况

#include <iostream>
#include <cstring>
using namespace std; int main()
{
int a[5];
memset(a,10,5); cout<<a[0]<<endl;
cout<<a[1]<<endl;
cout<<a[2]<<endl;
cout<<a[3]<<endl;
cout<<a[4]<<endl; system("pause");
return 0;
}

就会出现这样的情况:

那这样呢

#include <iostream>
#include <cstring>
using namespace std; int main()
{
int a[5];
memset(a,10,5*sizeof(int)); cout<<a[0]<<endl;
cout<<a[1]<<endl;
cout<<a[2]<<endl;
cout<<a[3]<<endl;
cout<<a[4]<<endl; system("pause");
return 0;
}

还是不对:

然后我就思考一下为什么,觉得应该是这样

看第一个实例memset(a,10,5)。因为memset是以字节为单位的,所以其含义就是int a[5]。以地址a起始,5个字节都要赋值为10。

这样的话,a[0]=0x0A0A0A0A,即为168430090

a[1]=0xXXXXXX0A

a[2]没赋值

a[3]没赋值

a[4]没赋值

a[5]没赋值。所以会出现上面的情况。

而第二个例子memset(a,10,5*sizeof(int))。

无非还是以字节为单位赋值了20个字节,

a[0]=0x0A0A0A0A

a[1]=0x0A0A0A0A

a[2]=0x0A0A0A0A

a[3]=0x0A0A0A0A

a[4]=0x0A0A0A0A,出现的结果即都是168430090。

所以说,我觉得除了char数组,其余的(比方说struct,int[])用memset函数均需要小心谨慎,今天写一个程序就栽在这里了,特地写一篇总结。但后来发现memset函数还有成功的时候,就是

int a[10];

memset(a,0,10*sizeof(int));

哈哈,原理自不必说了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

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. 1. Elasticsearch startup on local

    Download: https://www.elastic.co/downloads/elasticsearch 2. Setting: 1. [elasticsearch]\config\elast ...

  2. mysqld: Can't change dir to 'D:\TONG\mysql-5.7.19-winx64\data\' (Errcode: 2 - No such file or directory)

    mysqld: Can't change dir to 'D:\TONG\mysql-5.7.19-winx64\data\' (Errcode: 2 - No such file or direct ...

  3. org.springframework.web.multipart.MultipartException: The current request is not a multipart request

    今天做图片上传的碰到这个问题,查找原因是html请求的方式问题.from中涉及到图片上传的就要用post提交方式.否则就会报这个错误.如果已经是post的提交方式了还有这个错...还有两种解决方法. ...

  4. Python3.5学习之旅——day5

    模块初识 一.定义 在python中,模块是用来实现某一特定功能的代码集合.其本质上就是以‘.py’结尾的python文件.例如某文件名为test.py,则模块名为test. 二.导入方法 我们在这一 ...

  5. C/C++网络编程7——多进程服务器端之fork函数

    通过前面几节的内容,我们已经可以实现基本的C/S结构的程序了,但是当多个客户端同时向服务器端请求服务时,服务器端只能按顺序一个一个的服务,这种情况下,客户端的用户是无法忍受的.所以虚实现并发的服务器端 ...

  6. 使用外网访问Flask项目

    在学习flask过程中,想使用手机访问项目,根据flask手册中可以将 app.run(host='192.168.1.109', port=8000,debug=True) 但是发现手机依然无法连接 ...

  7. [转]Java监听器的原理与实现

    原文链接 监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动.监听器其实就是一个实现特定接口的普通java程序,这个程序专门用 ...

  8. PaperReading20200227

    CanChen ggchen@mail.ustc.edu.cn   Neural Predictor for Neural Architecture Search Motivation: Curren ...

  9. Java基础 -3.5

    我觉得上一篇不是很严谨啊 我认为这个逻辑还是正确的 原码.反码.补码: (1)在Java中,所有数据的表示方式都是以补码形式来表示 如果没有特别的说明,Java 中的数据类型默认为int,int数据类 ...

  10. springboot 重写 AuthorizationFilter

    原文链接:https://www.cnblogs.com/zeussbook/p/10778532.html