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

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

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

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

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

char str[];
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] 进行清零的操作如下

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

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

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

(2)Demo如下:

#include <iostream>
using namespace std; int main(void)
{
char buffer[] = "Helloworld\n";
cout << "Buffer before memset: " << buffer << endl;
memset(buffer, '*', strlen(buffer));
cout << "Buffer after memset: " << buffer << endl;
system("pause");
return ;
}

result:

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

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

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. 使用 AppFuse 的七个理由

    mvn -e  archetype:generate -B -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfus ...

  2. python seq

    missing parentheses in call to print  ==> python高版本 print("") name 'raw_input' is not d ...

  3. 从java程序员到CTO的成长路线图

    很多新人不知道从事java开发,具体的发展路径是怎么样的,甚至很多人都不能区分程序猿和攻城师的区别.包括不少小白,从事java开发都半年,甚至1年了,对职业发展还没有清晰的认证.这非常不利于自己的发展 ...

  4. 问题-Error creating object. Please verify that the Microsoft Data Access Components 2.1(or later) have been properly installed.

    问题现象:软件在启动时报如下错误信息:Exception Exception in module zhujiangguanjia.exe at 001da37f. Error creating obj ...

  5. Altium Designer 多通道设计

    转chenzelin2009的csdn博客:http://blog.csdn.net/chenzelin2009/article/details/5751251# Altium Designer的多图 ...

  6. 安卓问题http://blog.csdn.net/xb12369/article/details/50510302

  7. (一)Memcached初学教程之安装服务篇(Windows下)

    1.下载Memcached的Windows服务安装程序(备注:memcached官网:http://memcached.org/ ,没有提供windows下的安装包,只有UNIX下的安装包,我们这里用 ...

  8. pycharm的使用技巧

    本文将持续更新一些关于在使用pycharm的过程中的小技巧: 多行缩进/取消缩进 选中需要更改的代码,按 shift + tab 多行注释/取消注释 选中需要更改的代码,按 ctrl  +  / 滚轮 ...

  9. MySQL B+树索引和哈希索引的区别

      导读 在MySQL里常用的索引数据结构有B+树索引和哈希索引两种,我们来看下这两种索引数据结构的区别及其不同的应用建议. 二者区别 备注:先说下,在MySQL文档里,实际上是把B+树索引写成了BT ...

  10. Android开发之玩转FlexboxLayout布局

    在这之前,我曾认真的研究过鸿洋大神的Android 自定义ViewGroup 实战篇 -> 实现FlowLayout,按照大神的思路写出了一个流式布局,所有的东西都是难者不会会者不难,当自己能自 ...