之前有一个程序栽在了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. MyBatis 入门Demo

    新建数据库my_db,新建表student_tb id为主键,不自动递增. 不必插入数据. 下载MyBatis https://github.com/mybatis/mybatis-3/release ...

  2. windows下创建/删除服务

    windows下创建/删除服务 1.      windows下创建/删除服务 1.1.    创建服务 命令格式: sc [servername] create Servicename [Optio ...

  3. 利用正则表达式判断Java中的秒钟、分钟、小时、日、月是否符合规则

    // 定义校验规则 Pattern patRule = Pattern.compile("判断规则"); // 校验结果 patRule.matcher("判断的对象&q ...

  4. python中numpy.concatenate()函数的使用

    numpy库数组拼接np.concatenate 原文:https://blog.csdn.net/zyl1042635242/article/details/43162031 思路:numpy提供了 ...

  5. 【PAT甲级】1015 Reversible Primes (20 分)

    题意: 每次输入两个正整数N,D直到N是负数停止输入(N<1e5,1<D<=10),如果N是一个素数并且将N转化为D进制后逆转再转化为十进制后依然是个素数的话输出Yes,否则输出No ...

  6. C++面试常见问题——04链表的逆序与合并

    链表的逆序与合并 链表的逆序 已知一个链表的头指针为head,将该链表逆序. #include<iostream> using namespace std; struct Node{ in ...

  7. 「Luogu P3168 [CQOI2015]任务查询系统」

    介绍本题的两种做法: 方法1 前置芝士 线段树:一个很重要的数据结构. 树状数组:一个很重要的数据结构. 具体实现 区间修改,单点查询很容易就会想到树状数组了,至于查询前k个数的和又可以丢给权值线段树 ...

  8. SystemVerilog for design 笔记(二)

    转载请标明出处 1. System Verilog文本值和数据类型 1.1. 增强的文本值赋值 相对于verilog,SV在文本值赋值时可以1.无需指定进制    2.赋值可以是逻辑1 用法: reg ...

  9. 34 java 文件过滤 FileFilter

    package com.da.tool.util; import org.apache.commons.io.filefilter.RegexFileFilter; import java.io.Fi ...

  10. SpringBoot项目中自定义注解的使用

    1.定义注解接口 @Documented @Retention(RUNTIME) @Target(METHOD) public @interface MyLog {    String value() ...