![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c与c++
文章平均质量分 66
shiyuqing1207
这个作者很懒,什么都没留下…
展开
-
C++中Static作用和使用方法
转载地址:http://blog.csdn.net/artechtor/article/details/2312766面试的时候经常会遇到static的问题,特意发现上面那篇博客总结的很好,只是原作者写的很多地方不够总结,有很多重复的地方。1、什么是static? static 是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性。2、为什么要引入s转载 2015-05-21 15:18:25 · 462 阅读 · 0 评论 -
函数重载
重载函数必须形参不同,形参不同是指形参个数不同或者形参类型不同。而不能仅形参的参数名不同,因为在前面的我的文章中低层可以看到,函数低层实现不会有函数名这个东西的,也不能仅是函数返回值类型不同原创 2015-06-04 10:59:25 · 370 阅读 · 0 评论 -
const详解
const是一个关键字,用来限定所修饰的内容不可以再被更新。1 const与指针:第一种:int const *p 是指指针指向常量,指针所指向的内容不可以变,指针本身的值可以变,也就是指针的指向可以变。可以看到 int const (*p),*p就是p指向的内容。含义理解:仓库管理员可以去任何一个仓库,但是不可以动仓库里面的东西。int const *p 与 const int原创 2015-05-23 15:44:12 · 629 阅读 · 0 评论 -
从汇编和高级语言的角度理解传值方式,传值,传引用,传指针的本质机制与区别。白话通俗易懂。
函数的传参与返回值的方式有传值和传递引用,c语言中就是传值,而c++扩展传引用。而传值分为传递值(实参的值,此时形参是实参在内存中的一份拷贝,形参在使用时分配内存,结束时释放,实参和形参在内存中的地址不同,因此对形参的改变不会改变实参)传值的另外一种是传指针(传递的值是实参的地址,此时形参的值为实参的地址,所以对形参的修改就会修改实参的值)而传引用,从高级语言的层面看,引用是实参的别名原创 2015-05-23 21:22:28 · 1537 阅读 · 0 评论 -
从汇编的底层代码实现角度深入理解形参和实参
形参是在函数定义时给出的参数,实参是主调函数中调用某一个函数时给出的。形参和实参的作用是实现主调函数与被调函数之间的数据传递,也就是我们通常所说的传参。形参实际是实参在被调函数中的一份拷贝,调用时压入栈中,分配内存,当调用函数结束,内存就会释放,那一份拷贝随之释放。从底层汇编代码来看,主调函数在调用另外一个函数的时候,会先将参数传入,调用函数是通过栈过程来实现的,被调函数把参数压入栈中原创 2015-05-23 16:36:15 · 1570 阅读 · 0 评论 -
引用与数组,引用与类,引用与返回值,引用与多态,const引用,引用类型
引用(reference)1 &不是取地址,只是引用的标示符号。2 引用必须被初始化,因为引用是被引用对象的别名,那就要先要有被引用对象,比如一个人有一个绰号,那么引用相当于这个绰号,那么必须有一个绰号对应的人这个对象。一旦定义这个别名就不可以再作为别的变量名了。3 引用本身是有地址的,一般是一个4字节的内存来保存,被引用对象的地址,但是由于编译器的优化,每次碰到引用就会用被引用对象的原创 2015-05-24 20:35:11 · 607 阅读 · 1 评论 -
c++复习记录1 深拷贝与浅拷贝
一、深拷贝与浅拷贝浅拷贝又称为引用拷贝,就是拷贝之后,共用同一个实体,只是引用名不同了,对其所做的改变都将改变原来的值。深拷贝又称为值拷贝,拷贝之后,有不同的名字,不同的内存空间,对其所做的改变都不会改变原来的值。主要区别:在拷贝指针的时候,浅拷贝只是把指针拷贝一份,指针所指的内容不拷贝,拷贝后的结果是,两个不同的指针,但是指向同一块内存地址,这样就造成了在调用析构函数进行析构的时候,原创 2015-07-01 20:23:18 · 684 阅读 · 0 评论 -
C++复习记录2 二义性 malloc free 以及 new delete
首先通过一段例子程序来看函数的二义性,有重载函数的构造函数造成的。红色。另外还有一些关于new和delete以及析构函数应该注意的地方#includeusing namespace std;class Point{ public: Point() { X=Y=0; co原创 2015-07-01 21:44:48 · 637 阅读 · 0 评论 -
字符串识别与过滤
首先这道题目,看到测试用例之后,就知道,第一点要考察逗号作为分隔符,第二点,要读题意是连续重复的,我第一遍读题的时候,就没有看到连续的,以为重复的只需要输出一个来。那么很自然第二点就是考察,如果将连续重复的只输出一个。接下来,提供自己的两种解法。解法一:#include#includeusing namespace std;int main(){ int len1,len2;原创 2015-08-30 19:12:52 · 2390 阅读 · 0 评论 -
函数默认形参
默认形参值的作用:函数声明时可以预先给出默认的形参值,如果函数调用是给出实参值,则使用实参值,否则采用预先给出的默认形参值。int add(int x=5,int y=6){ return x+y;}void main(void){ add(10,20); //10+2 add(10); //10+6 add()原创 2015-06-04 10:43:14 · 1490 阅读 · 0 评论 -
inline 内联函数
在函数调用时像宏定义一样把函数体代码展开,节省了参数压栈,恢复现场等的函数调用的时间空间开销。与宏定义的区别是,宏定义是在预处理的时候,内联函数是在编译器执行的时候。宏的缺点,不能访问对象的私有成员,容易产生二义性,有时候需要加上括号。用关键字inline,但是类中的函数不管有没有inline一般默认为内联函数。要注意使用内联时注意代码的暴露。原创 2015-06-04 10:35:10 · 521 阅读 · 0 评论 -
线程与进程
首先,应用程序是一个存储在计算机系统的硬盘等存储空间中的静态文件,而处于可执行状态中的应用程序称为进程,进程是应用程序的一个执行过程。从操作系统角度看,进程是操作系统分配内存,cpu时间片等资源的基本单位,为正在运行的程序提供运行环境。在unix操作系统中,进程是系统资源分配的基本单位。Unix操作系统也会自己启动进程,用于管理内存资源以及对用户进程进行调度,无论是操作系统自己创建的进程还是由原创 2015-05-21 20:25:33 · 462 阅读 · 0 评论 -
深入理解计算机系统 perflab 程序性能优化实验
自从上次实验3bomb已经过去很久了,昨天周六下午刚刚验收完所带班级的必做实验的最后两个,最近一直很忙,也没有来更新了,其实不是最近应该是每天都好忙,最近一直还在看论文做实验。验收前周五拿出时间来看了一下最后两个必做实验。一个是perflab,性能实验,这个实验主要是考察的课本中的第五章的程序优化的一些知识,通过优化程序的核函数,然后来对比自己和原始函数的CPE和加速比。这个实验主要考虑一原创 2015-05-31 11:04:50 · 17690 阅读 · 0 评论 -
底层理解函数调用实现过程 栈结构 栈过程
首先寄存器使用惯例:eip :指令地址寄存器,保存程序计数器的值,当前执行的指令的下一条指令的地址值,16位中为ip,32位为eip。eip不可以直接赋值,一般都是cpu自动加1来更新,指令call和ret以及jmp可以改变eip的值。另外汇编代码格式有ATT和intel格式,gcc和objdump的默认格式就是ATT。几个小区别,1首先是指令ATT汇编指令后面有一个l,比如intel格式原创 2015-05-31 18:26:25 · 3152 阅读 · 1 评论 -
CSAPP 深入理解计算机系统 Buflab实验,缓冲区溢出攻击实验(6)
level4前面4个level都是栈基址是固定的,所以我们可以猜测到栈帧的结构进行覆盖篡改,这一关就是引入了缓冲区溢出攻击的一种保护措施,就是栈基址随机化,让栈基址不可以猜测,我们来实施缓冲区溢出攻击,那么我们就要用到nop雪橇了。nop只是执行eip自加1不进行其他的操作。在我们无法猜测的时候,只需要找到最大的地址,然后前面用nop雪橇那么只要在nop段中都会自动划入。这一level用的原创 2015-06-01 21:06:45 · 7084 阅读 · 4 评论 -
CSAPP 深入理解计算机系统 Buflab实验,缓冲区溢出攻击实验(2)
Level0首先是test函数和getbuf函数以及smoke函数的c代码如下: Level0 就很简单,就是本来test函数调用getbuf函数,调用完以后还返回test函数,现在我们要做的是调用getbuf函数后,通过输入我们的exploit,使得调用完以后不返回test函数了而是执行smoke函数。这里的实现就很简单,只需要输入超出缓冲区大小的字符串来覆盖到g原创 2015-06-01 19:26:33 · 7971 阅读 · 2 评论 -
CSAPP 深入理解计算机系统 Buflab实验,缓冲区溢出攻击实验(4)
level2Level2是更进了一步,也是不返回到test,而是去执行函数bang,但是区别是bang也要传入参数,但是参数是是一个全局变量,这里就是不同于level1那样在栈上覆盖了,因为全局变量要去内存地址中修改了,但是又不能调用个一个可以修改全局变量的函数,这里就只能利用我们的exploit代码了,让我们的exploit代码具有执行这些功能的函数,那么怎么执行起来呢,那就是把区别与之前是原创 2015-06-01 20:19:28 · 8512 阅读 · 0 评论 -
CSAPP 深入理解计算机系统 Buflab实验,缓冲区溢出攻击实验(5)
level3前面的几个实验都是不管是去执行别的函数比如bang还是去执行我们自己的exploit的函数,最后都没有返回就退出了,我们通过我们的漏洞利用代码可以修改内存(比如把全局变量修改为我们的cookie)修改寄存器中的值,比如当前的level3,我们都把原来的恢复现场需要用的返回地址和原test的ebp给破坏了,这一关中,我们将修复这些被我们破坏的栈状态信息,让最后还是回到test中,让被原创 2015-06-01 21:04:52 · 6460 阅读 · 1 评论 -
CSAPP 深入理解计算机系统 Buflab实验,缓冲区溢出攻击实验(3)
Level1Level1是和level0一样调用完getbuf以后我们不返回getbuf的调用者test而是去执行fizz函数,区别就是这个fizz函数要求我们传入参数,而且传入的参数必须是我们的cookie。所以在level0的方法我们轻松的知道了如何去执行fizz,就是用fizz函数的入口地址去覆盖返回地址,这里的关键就是找到fizz函数的参数从栈中的什么地方传入的,然后我们把我们的coo原创 2015-06-01 19:46:30 · 6989 阅读 · 2 评论 -
完美数字
这个题目非常简单,主要注意,同时整除就是a%b==0,这里几个条件,多个&&,不要漏掉了,然后还要考虑的就是非法越界的判断情况。#include#includeusing namespace std;int main(){ int a,b; int num=0,i; cin>>a; cin>>b; if(a>b||a>10000||b>10000||a<=0||b<=0)原创 2015-08-30 19:16:50 · 795 阅读 · 0 评论