C++基础学习-20120516
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相关推荐
- 【转】oracle PLSQL基础学习
[转]oracle PLSQL基础学习 --oracle 练习: /**************************************************PL/SQL编程基础****** ...
- python创建对象的格式为_Python入门基础学习(面向对象)
python基础学习笔记(四) 面向对象的三个基本特征: 封装:把客观事物抽象并封装成对象,即将属性,方法和事件等集合在一个整体内 继承:允许使用现有类的功能并在无须重新改写原来的类情况下,对这些功能 ...
- 虚幻引擎虚拟现实开发基础学习教程
流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.93 GB |时长:5h 15m 了 ...
- 动画产业基础学习教程 Rad How to Class – Animation Industry Fundamentals
如何分类--动画产业基础 大小解压后:6.2G 含课程素材 1920X1080 mp4 语言:英语+中英文字幕(根据原英文字幕机译更准确) 信息: 绘画技巧.解剖学.角色设计.透视和整体讲故事--这门 ...
- Blender纹理基础学习视频教程 CGCookie – Fundamentals of Texturing in Blender
Blender纹理基础学习视频教程 CGCookie – Fundamentals of Texturing in Blender Blender纹理基础学习视频教程 CGCookie – Funda ...
- ue5新手零基础学习教程 Unreal Engine 5 Beginner Tutorial - UE5 Starter Course
ue5新手零基础学习教程 Unreal Engine 5 Beginner Tutorial - UE5 Starter Course! 教程大小解压后:4.96G 语言:英语+中英文字幕(机译)时长 ...
- 0基础学好python难不难_零基础学习Python难不难?Python有什么优势?
原标题:零基础学习Python难不难?Python有什么优势? Python是一种计算机程序设计语言.首先,我们普及一下编程语言的基础知识.用任何编程语言来开发程序,都是为了让计算机干活,比如下载一个 ...
- 计算机一级ps2019,2019年计算机一级考试PS基础学习点子:PS菜单中英文对照表.docx...
2019 年计算机一级考试 PS 基础学习点子: PS 菜单中英文对照表 PS菜单中英文对照表 一.File New 2.Open 3.Open As 4.Open Recent Close 6.Sa ...
- Java零基础学习难吗
java编程是入行互联网的小伙伴们大多数的选择,那么对于零基础的小伙伴来说Java零基础学习难吗?如果你是初学者,你可以很好的理解java编程语言.并不困难.如果你的学习能力比较高,那么你对Java的 ...
最新文章
- 中层管理者,你到底怎样管理?
- java_oop_接口
- Python 格式化输出和while循环的两个小练习
- 制作系统盘,重装新系统。
- 如何找到ngrx action匹配的取数据代码 - 谈谈Spartacus Product Carousel控件数据的读取
- php 连接符.,PHP怎么在数字之间添加连接符
- Java static、 final修饰符
- memcached—如何在Windows操作系统中安装、启动和卸载memcached
- 网易的企业免费邮箱和腾讯的企业邮箱
- 格雷码的FPGA实现
- Nginx配置静态资源服务器
- 关于单机winform数据库 数据存储
- flex 3 格式化组件
- 公司网站无意使用了”方正字体”,被”索赔
- iphone 的文件目录和简单介绍
- 服务器可不可以选择ssd硬盘
- 锅炉实现物联网云平台方案
- HTML单选、多选、按钮、下拉框、文本输入框
- ChinaSoft 论坛巡礼 | 泛在计算时代的智能化运维
- IBM GBS部门
热门文章
- Android用户界面
- Pair Project:电梯控制程序 编写心得 最新版
- sdi线缆标准_常见的视频信号传输线缆种类及传输距离线缆有哪些?
- easyexcel 日期类型 convert_[Oracle 专题] SQL 日期、数字、字符串,运算、转换
- Spark源码分析之Master状态改变处理机制原理
- 患者数据库mysql_关系型数据库之MySQL基础总结_part1
- (27)Verilog HDL循环语句:while
- git 创建webpack项目_使用webpack手动创建一个完整项目的全过程
- 【Python】实现文章字符频次排序(文件IO、列表排序、字典操作和字符串join方法)
- I2C总线学习—查缺补漏—应答信号ACK