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

1.memset函数的声明和含义如下:

函数解释:将s所指向的某一块内存中的前n个字节的内容全部设置为 ch 指定的 ASCII值, 第一个值为指定的内存地址块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的指针。该函数对数组而言只能用于数组的置0或-1,其他值无效。其作用是在一段内存块中填充某个给定的值,它是对较大的结构体或者数组进行清零操作的一种最快方法。函数声明如下:

  1. void * memset(void *s, int ch, size_t n);

memset 函数而已用于初始化内存,例如:

  1. char str[];
  2. memset(str,,);

2.memset函数的常见错误用法

(1)memset函数对数组而言,只能进行置0或者置(-1)操作,而不能是其他的数值。

  因为memset函数是对单个字节进行操作,如果将int a[5]值为2,操作为:memset(a,2,sizeof(int)*5);因为他是整型数组,有四个字节,而每个字节都被赋值为2,即a[5]中的每个元素的每个字节都被赋值为2(例如a[0]的二进制表示为00000010 00000010 00000010 00000010   , 所以输出十进制a[0]的值为 33686018);而(-1)的二进制表示为(11111111 11111111 11111111 11111111),因此置为(-1)不会改变其值。

(2)memset(void *s, int key,size_t n) 中ch实际范围应该在0~~255。

(3)注意ch 和 n 的位置不能弄反

3.memset的使用情形比较

例如:将 char a[20] 进行清零的操作如下

  1. memset(a,,*sizeof(char));      //将char a[20] 清零

(1)两种情况下使用memset函数的比较

  1. char buffer[];
  2. memset(buffer,,sizeof(char)*); //将buffer[4] 清零
  3. strcpy(buffer,"");          //将字符串 “123” 复制到 buffer中
  4.  
  5. //此时字符串的总长为4位(包括结尾的 ‘\0’ )
  6. //因为拷贝的字符串将buffer全部覆盖,因此,此时的memset可以不需要
  1. char buffer[];
  2. memset(buffer,,sizeof(char)*);
  3. memcpy(buffer,"",);
  4. //这一条的memset并不多余,memcpy并没把buffer全部覆盖,如果没有memset,
  5. //用printf打印buffer会有乱码甚至会出现段错误。
  6. //如果此处是strcpy(buffer,"123");便不用memset,
  7. //strcpy虽然不会覆盖buffer但是会拷贝字符串结束符

(2)Demo如下:

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main(void)
  5. {
  6. char buffer[] = "Helloworld\n";
  7. cout << "Buffer before memset: " << buffer << endl;
  8. memset(buffer, '*', strlen(buffer));
  9. cout << "Buffer after memset: " << buffer << endl;
  10. system("pause");
  11. return ;
  12. }

result:

PS:关于内存访问冲突问题

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. char *s="GoldenGlobalView";     //改为char s[] = "GoldenGlobalView";则没有问题
  6. memset(s,'G',); //单步运行到这里会提示内存访问冲突
  7. printf("%s",s);
  8. getchar();
  9. return ;
  10. }

C/C++中memset函数的更多相关文章

  1. cpp中memset函数的注意点

    可参考: C++中memset函数的用法 C++中memset函数的用法 C++中memset()函数的用法详解 c/c++学习系列之memset()函数 透彻分析C/C++中memset函数 mem ...

  2. 2018/08/23 cstring中memset()函数的运用

    好多东西其实以前已经查过了,然后当时理解的还行,可是过段时间没用有些又会忘记,然后又去找资料又查,浪费了不少的时间和精力,所以,我,曾国强,今天起,要好好做笔记了! 今天复习第一个知识点,为什么要叫复 ...

  3. 透彻分析C/C++中memset函数

    在C语言中,经常需要对内存进行操作,里面涉及很多函数,但是memset函数的使用有一点需要大家格外注意,这也是我在做项目时遇到过的一个问题,调试了很久才找出来错误. 函数原型是:void *memse ...

  4. C++中memset函数的用法

    转载:https://blog.csdn.net/qq_22122811/article/details/52738029 //复习数组的时候,第一次见到了memset,学之. memset:char ...

  5. C++之memset函数

    可参考: C++中memset函数的用法 C++中memset函数的用法 C++中memset()函数的用法详解 c/c++学习系列之memset()函数 透彻分析C/C++中memset函数 mem ...

  6. memset函数详解

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

  7. 深入学习 memset 函数

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

  8. strcpy, memcpy, memset函数

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

  9. memset函数具体说明

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

随机推荐

  1. 使用Hadoop打造私有云盘之API操作

    项目介绍:使用hadoop实现云盘的增删读获取列表功能,hadoop不支持数据修改,特性是一次写入多次读取.主流的网盘也不支持该功能.今天我们用hdfs的FileSystem实现这些操作. 1.上传功 ...

  2. iOS xcodebuild 打包app

    1.传统的app打包(没有使用cocopods) 在打包之前,先把证书和配置文件选好. step1:打开终端,cd 进入到工程目录中 step2:xcodebuild clean(如果buid文件存在 ...

  3. Oracle10g/11g 在SUSE/RHEL上的安装与配置

    在过去对众多项目的支撑过程中,Oracle作为首选数据库,其安装与配置过程成了重复性最多的工作之一.在此,我进行了总结,并分享出来,希望能对大家有所帮助.随着Oracle版本的提升,从9i -> ...

  4. J2EE开发常用开源框架技术(转)

    主要就我所了解的J2EE开发的框架或开源项目做个介绍,可以根据需求选用适当的开源组件进行开发.主要还是以Spring为核心,也总结了一些以前web开发常用的开源工具和开源类库 1持久层:1)Hiber ...

  5. pptp vpn

    webalizer是一个高效的.免费的web服务器日志分析程序.其分析结果以HTML文件格式保存,从而可以很方便的通过web服务器进行浏览; http://daliang1215.iteye.com/ ...

  6. What does enumerable mean?

    I was directed to MDN's for..in page when it said, "for..in Iterates over the enumerable proper ...

  7. 从app里跳到appstore评论页面的实现

    // 如果要实现在应用里面跳到appstore的对应评论页面里面的话,只要将下面地址中App_ID替换成自己的id就可以了,其他的地方都不用管. // 如果要用Safari浏览器做实验的话可以将地址中 ...

  8. 利用ACE 自己实现的线程池

    1: 线程池组件的配置文件: [log] ;DEBUG = 0 ;INFO = 1 ;WARN = 2 ;FAULT = 3 level=0 ;SCREENOUT = 0 ;FILEOUT = 1 ; ...

  9. php数组相加 两个数组键名相同 后者不能覆盖前者

    array(“a”)+array(“b”)结果还是array(“a”) array(“a”)+array(“b”)的结果是 array(“a”) 因为,它们等效于array(“0″=>”a”)+ ...

  10. GitHub初次使用记录(一)

    1.从GitHub上克隆或者复制别人的档案库: