之前有一个程序栽在了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. url转码。

    Javascript 中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,deco ...

  2. zip 多维

    ll=zip([[1,3],[2,4]],[[88,99],[66,55]])a=zip(*ll)# print(list(a)) #[([1, 3], [2, 4]), ([88, 99], [66 ...

  3. linux 镜像备份工具rsnyc

    1.本地拷贝文件nohup rsync -avzh /data/wwwroot/xhprof/* /mnt/xhprof/ &2.更改文件夹名称mv /data/wwwroot/xhprof ...

  4. FTP-Publisher Plugin

    使用 FTP-Publisher Plugin 在 http://wiki.hudson-ci.org/display/HUDSON/FTP-Publisher+Plugin 有详细说明, 需要注意的 ...

  5. php 基础知识 常见面试题

    1.echo.print_r.print.var_dump之间的区别 * echo.print是php语句,var_dump和print_r是函数 * echo 输出一个或多个字符串,中间以逗号隔开, ...

  6. SQL SERVER 2005还原差异备份、日志备份 2012-03-29 11:43

    其实要备份,还原最安全最有保障的是完全备份.但是完全备份肯定是需要更多的磁盘空间的开销.尤其是数据量比较大的.比如基数是500M,每天的增长量为10M,那么第一次完全备份是500M,第二次是510M, ...

  7. nginx访问目录是没加/的重定向控制

    static 模块提供了root与alias功能:发现目标是目录时:但URI末尾未加/时:会返回301重定向:重定向后会加/ 指令 Syntax: server_name_in_redirect on ...

  8. static在c\c++中的作用(翁恺c++公开课[28-29]学习笔记)

    static相对来说是一个较复杂的修饰符,c++中的static在c的基础之上又包含了static在类中的应用(也就是说多了static的成员变量和static的成员函数):c\c++中静态变量.对象 ...

  9. 【PAT甲级】1005 Spell It Right (20 分)

    题意: 给出一个非零整数N(<=10^100),计算每位之和并用英文输出. AAAAAccepted code: #include<bits/stdc++.h> using name ...

  10. 自定义更改 Xcode 新建 .h/.m 文件头部注释说明(文件名、工程名、作者、公司、版权等)信息

    使用 Xcode 新建工程文件时,或默认生成一套注释说明信息在 .h/.m 文件的头部,说明了创建这个文件的名称.工程名.日期.作者.公司.版权等信息 // // ___FILENAME___ // ...