1、
一下是使用strcpy_s与strcpy的安全性比较

char szBuf[2] = {0};

strcpy_s(szBuf, 2, "12131");  //新的CRT函数
 strcpy(szBuf,  "12131");    //老的CRT函数

上述代码,明显有缓冲区溢出的问题。 使用strcpy_s函数则会抛出一个异常。而使用strcpy函数的结果则未定,因为它错误地改变了程序中其他部分的内存的数据,可能不会抛出异常但导致程序数据错误,也可能由于非法内存访问抛出异常。

使用新的增强安全的CRT函数有什么好处呢?简单地说,新的函数加强了对参数合法性的检查以及缓冲区边界的检查,如果发现错误,会返回errno或抛出异常。老版本的这些CRT函数则没有那么严格的检查与校验,如果错误地传输了参数或者缓冲区溢出,那么错误并不能被立刻发现,对于定位程序错误也带来更大困难。

2---------
assert断言的使用:
1:assert是宏,而不是函数。
void assert( int expression );   
assert的作用是先计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,   
然后通过调用 abort 来终止程序运行。
使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。
1)在函数开始处检验传入参数的合法性
2)每个assert最好只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败
3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题
4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感
5)有的地方,assert不能代替条件过滤

3-----------悬挂指针

与内存泄露相比,C++最令人头痛的问题是内存越界,而内存越界很多情况下是由于悬挂指针引起的。  
假设一个指针变量: Object * ptr;
使用ptr时,我们除了要判断ptr是否为0以外,还要怀疑它指向的对象是否有效,是不是已经在别的地方被销毁了。我们希望当它指向的对象被销毁时,ptr被自动置为0。
所谓指针悬挂是指指针指向了一块没有分配给用户使用的内存

4---------野指针
成因:
1指针变量没有初始化。不指向null可能指向任何位置
2被free或delete之后,没有置为null,被认为是合法的指针
3指针操作超越了变量的作用范围。

5------------
strcpy与memcpy的区别
void *memcpy(void *dest, const void *src, int n);与strcpy相比,memcpy并不是遇到'\0'就结束,而是一定会拷贝完n个字节
如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址

6----------
memset的使用 
void *memset(void *s, int ch, size_t n); 作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。
因为第一个程序的 数组a是字符型的,字符型占据内存大小是1Byte,而memset函数也是以字节为单位进行赋值的,所以你输出没有问题。而第二个程序a是整型的,使用 memset还是按字节赋值,这样赋值完以后,每个数组元素的值实际上是0x01010101即十进制的16843009。你看看你输出结果是否这样?   
2.如果用memset(a,1,20);  a是int型的4字节 就是对a指向的内存的20个字节进行赋值,每个都用ASCII为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个INT元素是4 字节,合一起就是00000001000000010000000100000001,就等于16843009,就完成了对一个INT元素的赋值了
memset(s,'G',6);//可以对字符串给定字符值,char和int可以相互转换啊

7------------
sprintf的用法:把数据打印到字符串中
int sprintf( char *buffer, const char *format, [ argument] … ) ;
char s[100];
sprintf(s,"%d",123);把123以十进制方式右对齐打印到字符串s中
sprintf(s,"-%d",123);左对齐
sprintf(s,"%d%d",123,234);第3,4个参数个数可变
连接字符串比strcat好用
sprintf(s,"%s love %s","i","wyy");
sprintf 在MFC 中也能找到他的知音:CString::Format
sprnitf 还有个不错的表妹:strftime,专门用于格式化时间字符串的
time_t t = time(0);
//产生"YYYY-MM-DD hh:mm:ss"格式的字符串。   
char s[32];
strftime(s, sizeof(s), "%Y-%m-%d %H:%M:%S", localtime(&t));

8----------
extern char *strcat(char *dest,char *src);
把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 返回dest指针

9-----------
字符串和字符数组的区别:
字符数组char ch[]={'a','b','c','d','\0'};//必须手动指定结束符
char ch[]={"abcdefg"};一维的字符数组
char ch[][]={"asada","dasfa"};二维的数组
字符串char ch="abcdefg";默认带有结束符\0
char ch[]={'a','b','c','d'}strlen为啥是13,VS下编译???????????????

转载于:https://www.cnblogs.com/fickleness/p/3148977.html

C++基础学习-20120516相关推荐

  1. 【转】oracle PLSQL基础学习

    [转]oracle PLSQL基础学习 --oracle 练习: /**************************************************PL/SQL编程基础****** ...

  2. python创建对象的格式为_Python入门基础学习(面向对象)

    python基础学习笔记(四) 面向对象的三个基本特征: 封装:把客观事物抽象并封装成对象,即将属性,方法和事件等集合在一个整体内 继承:允许使用现有类的功能并在无须重新改写原来的类情况下,对这些功能 ...

  3. 虚幻引擎虚拟现实开发基础学习教程

    流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.93 GB |时长:5h 15m 了 ...

  4. 动画产业基础学习教程 Rad How to Class – Animation Industry Fundamentals

    如何分类--动画产业基础 大小解压后:6.2G 含课程素材 1920X1080 mp4 语言:英语+中英文字幕(根据原英文字幕机译更准确) 信息: 绘画技巧.解剖学.角色设计.透视和整体讲故事--这门 ...

  5. Blender纹理基础学习视频教程 CGCookie – Fundamentals of Texturing in Blender

    Blender纹理基础学习视频教程 CGCookie – Fundamentals of Texturing in Blender Blender纹理基础学习视频教程 CGCookie – Funda ...

  6. ue5新手零基础学习教程 Unreal Engine 5 Beginner Tutorial - UE5 Starter Course

    ue5新手零基础学习教程 Unreal Engine 5 Beginner Tutorial - UE5 Starter Course! 教程大小解压后:4.96G 语言:英语+中英文字幕(机译)时长 ...

  7. 0基础学好python难不难_零基础学习Python难不难?Python有什么优势?

    原标题:零基础学习Python难不难?Python有什么优势? Python是一种计算机程序设计语言.首先,我们普及一下编程语言的基础知识.用任何编程语言来开发程序,都是为了让计算机干活,比如下载一个 ...

  8. 计算机一级ps2019,2019年计算机一级考试PS基础学习点子:PS菜单中英文对照表.docx...

    2019 年计算机一级考试 PS 基础学习点子: PS 菜单中英文对照表 PS菜单中英文对照表 一.File New 2.Open 3.Open As 4.Open Recent Close 6.Sa ...

  9. Java零基础学习难吗

    java编程是入行互联网的小伙伴们大多数的选择,那么对于零基础的小伙伴来说Java零基础学习难吗?如果你是初学者,你可以很好的理解java编程语言.并不困难.如果你的学习能力比较高,那么你对Java的 ...

最新文章

  1. 中层管理者,你到底怎样管理?
  2. java_oop_接口
  3. Python 格式化输出和while循环的两个小练习
  4. 制作系统盘,重装新系统。
  5. 如何找到ngrx action匹配的取数据代码 - 谈谈Spartacus Product Carousel控件数据的读取
  6. php 连接符.,PHP怎么在数字之间添加连接符
  7. Java static、 final修饰符
  8. memcached—如何在Windows操作系统中安装、启动和卸载memcached
  9. 网易的企业免费邮箱和腾讯的企业邮箱
  10. 格雷码的FPGA实现
  11. Nginx配置静态资源服务器
  12. 关于单机winform数据库 数据存储
  13. flex 3 格式化组件
  14. 公司网站无意使用了”方正字体”,被”索赔
  15. iphone 的文件目录和简单介绍
  16. 服务器可不可以选择ssd硬盘
  17. 锅炉实现物联网云平台方案
  18. HTML单选、多选、按钮、下拉框、文本输入框
  19. ChinaSoft 论坛巡礼 | 泛在计算时代的智能化运维
  20. IBM GBS部门

热门文章

  1. Android用户界面
  2. Pair Project:电梯控制程序 编写心得 最新版
  3. sdi线缆标准_常见的视频信号传输线缆种类及传输距离线缆有哪些?
  4. easyexcel 日期类型 convert_[Oracle 专题] SQL 日期、数字、字符串,运算、转换
  5. Spark源码分析之Master状态改变处理机制原理
  6. 患者数据库mysql_关系型数据库之MySQL基础总结_part1
  7. (27)Verilog HDL循环语句:while
  8. git 创建webpack项目_使用webpack手动创建一个完整项目的全过程
  9. 【Python】实现文章字符频次排序(文件IO、列表排序、字典操作和字符串join方法)
  10. I2C总线学习—查缺补漏—应答信号ACK