指针变量

缓存溢出

江枫思渺然 提交于 2020-02-23 04:47:10
缓存溢出(Buffer overflow),是指在存在缓存溢出安全漏洞的计算机中,攻击者可以用超出常规长度的字符数来填满一个域,通常是内存区地址。在某些情况下,这些过量的字符能够作为“可执行”代码来运行。从而使得攻击者可以不受安全措施的约束来控制被攻击的计算机。 1. 缓存溢出攻击方式 1.1 破坏活动记录 函数调用发生时,调用者会在栈中留下函数的活动记录,包含当前被调函数的参数、返回地址、前栈指针、变量缓存区等值,它们在栈中的存放顺序如图所示。 由它们在栈中的存放顺序可知,返回地址、栈指针与变量缓存区紧邻,且返回地址指向函数结束后要执行的下一条指令。栈指针指向上一个函数的活动记录,这样攻击者可以利用变量缓存区溢出来修改返回地址值和栈指针,从而改变程序的执行流。 1.2 破坏堆数据 程序运行时,用户用C、C++内存操作库函数如malloc、free等在堆内存空间分配存储和释放删除用户数据,对内存的使用情况如内存块的大小、它前后指向的内存块用一个链接类的数据结构予以记录管理,管理数据同样存放于堆中,且管理数据与用户数据是相邻的。这样,攻击者可以像破坏活动记录一样来溢出堆内存中分配的用户数据空间,从而破坏管理数据。因为堆内存数据中没有指针信息,所以即使破坏了管理数据也不会改变程序的执行流,但它还是会使正常的堆操作出错,导致不可预知的结果。 1.3 更改函数指针 指针在C、C+

小白算法积累——单链表25#带头结点单链表+穿插+逆置

被刻印的时光 ゝ 提交于 2020-02-22 16:07:52
题目 :设线性表L=(a1,a2,a3,…an-2,an-1,an)采用带头结点的单链表保存,链表中的结点定义如下: typedef struct node { int data; struct node*next }Node; 请设计一个 空间复杂度为O(1)且时间上尽可能高效 的算法,重新排列L中的各结点,得到线性表L’=(a1,an,a2,an-1,a3,an-2…) 关键字 :带头结点单链表+穿插+逆置 思路 :为了达到穿插+逆置的效果,我们选择 分段 + 逆置+插入 先观察L=(a1,a2,a3,…an-2,an-1,an)和L’=(a1,an,a2,an-1,a3,an-2,…) 发现L’是由L摘取第一个元素,再摘取倒数第一个元素…依次合并而成的。 为了方便链表后半段取元素,需要先将L后半段原地逆置【题目要求空间复杂度为O1,不能借助栈】,否则每取最后一个结点都需要遍历一次链表。 1)先找出链表L的中间结点,利用 速度差产生路程差法 ps:顺序表就是“直接算算地址”法了 为此设置两个指针p和q,指针p每次走一步,指针q每次走两步 当指针q到达链尾时,指针p自然就在链表的中间结点 2)将L的后半段结点原地逆置 需要变量:q的后继结点指针r,负责将“逆置指针”的工作 3)从单链表前后两段中依次各取一个结点,按要求重排。 需要变量: void change_list (

【知识总结】指针

只谈情不闲聊 提交于 2020-02-22 06:17:30
1.内存和地址 (1)内存中的每个位置由一个独一无二的地址标识; (2)内存中的每个位置都包含一个值; (3)变量名字与内存地址相对应,由编译器为我们实现,变量给了我们更方便的方法记住地址(硬件仍然通过地址访问内存位置); 【注】在某些要求边界对齐(boundary alignment)的机器上,整型值存储的起始位置只能是某些特定的字节,通常是2或者4的倍数; 2.值和类型 不能简单地通过检查一个值的位来判断它的类型,判断一个值的类型(以及它的值),必须观察程序中这个值的使用方法; 3.指针变量的内容 (1)一个变量的值就是分配给这个变量的内存位置多存储的数值; (2)指针变量存储的是某块内存的地址; 4.间接访问操作符 通过一个指针访问它所指向的地址的过程称为间接访问(indirection)或解引用指针(dereferencing point)。这个用于执行间接访问的 操作符是单目操作符*。 5.未初始化和非法的指针 声明一个指针并不会自动分配任何内存,在对指针执行间接访问前,指针必须进行初始化。 6.NULL指针 【注】对一个NULL指针进行解引用是非法的,在对指针解引用之前你首先必须确保它并非NULL指针。 7.指针常量 【问】如果想把25这个值存在100这个位置,该怎么办? 【答】 *(int *)100 = 25; 来源: https://www.cnblogs.com

c语言进阶6-指针

我与影子孤独终老i 提交于 2020-02-22 02:43:27
指针是c语言的一个重要组成部分 是c语言的核心、精髓所在,用好指针可以在c语言编程中起到事半功倍的效果。一方面,可以提高程序的编译效率和执行速度以及实现动态的存储分配;另一方面,使用指针可使程序更灵活,全球表示各种数据结构,编写高质量的程序。 指针是c语言显著的优点之一,其使用起来十分灵活而且能提高某些程序的效率,但是如果使用不当则很容易造成系统错误。许多程序“挂死“往往都是由于错误地使用指针造成的 一、 地址与指针 系统的内存就好比是带有编号的小房间,如果想使用内存就需要得到房间编号。图1定义了一个整型变量i,整型变量需要4个字节,所以编译器为变量i分配的编号为1000~1003. 什么是地址? 地址就是内存区中对每个字节的编号 ,如图1所示的1000/1001/1002和1003就是地址,为了进一步说明来看图2. 内存地址 内容 1000 0 变量i 1004 1 变量j 1008 2 1012 3 1016 4 1020 5 图2所示的1000、1004等就是内存单元的地址,而0、1就是内存单元的内容,换种说法就是基本整型变量i在内存中的地址从1000开始。因为基本整型占4个字节,所以变量j在内存中的起始地址为1004,变量i的内容是0. 那么指针又是什么呢?这里仅将 指针看作是内存中的一个地址,多数情况下,这个地址就是内存中另一个变量的位置,如图3所示。

内存管理:野指针以及非法内存操作

*爱你&永不变心* 提交于 2020-02-21 22:55:19
如果一个指针指向的内存没有访问权限,或者指向一块已经释放的内存,那么就无法对该指针进行操作,这样的指针称为野指针。 规避野指针 指针变量如果暂时不需要赋值,以定要初始化为nullptr,因为任何指针变量被创建时不会自动成为nullptr,它的缺省值是随机的。 当指针指向的内存被释放时,要将指针的值设置为nullptr,因为free()只是释放掉了内存,并未改变指针的值。 来源: https://www.cnblogs.com/xiaobaizzz/p/12343485.html

栈与队列

旧巷老猫 提交于 2020-02-21 19:37:30
目录 1 栈的定义 2 栈的顺序存储结构及实现 2.1 栈的顺序存储结构 2.2 栈的顺序存储结构--进栈出栈操作 3 两栈共享空间 4 栈的链式存储结构及实现 4.1 栈的链式存储结构--进栈操作 4.2 栈的链式存储结构--出栈操作 5 栈的应用--四则运算表达式求值 5.1 后缀表达式计算结果 5.2 中缀表达式转后缀表达式 6 队列的定义 7 循环队列 7.1 队列顺序存储 7.2 循环队列定义 8 队列的链式存储结构及实现 8.1 队列的链式存储结构--入队操作 8.2 队列的链式存储结构--出队操作 1 栈的定义 栈是限定仅在表尾进行插入和删除操作的线性表。允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈,栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。 栈是一个线性表,栈元素具有线性关系,即前驱后继关系,栈的表尾是指栈顶,而不是栈底。栈底是固定的,最先进栈的只能在栈底,栈的插入操作,叫作进栈,栈的删除操作,叫作出栈。 2 栈的顺序存储结构及实现 2.1 栈的顺序存储结构 栈的顺序存储其实也是线性表存储的简化,称为顺序栈;线性表是用数组来实现的,下标为0的一端作为栈底比较好,因为首元素都存在栈底,变化最小,所以让它作栈底。 定义一个top变量指示栈顶元素在数组中的位置,若存储栈的长度为StackSize

快慢指针

有些话、适合烂在心里 提交于 2020-02-21 15:48:36
快慢指针中的快慢指的是移动的步长,即每次向前移动速度的快慢。例如可以让快指针每次沿链表向前移动2,慢指针每次向前移动1次。 快慢指针的应用 判断单链表是否为循环链表 让快慢指针从链表头开始遍历,快指针向前移动两个位置,慢指针向前移动一个位置;如果快指针到达NULL,说明链表以NULL为结尾,不是循环链表。如果 快指针追上慢指针,则表示出现了循环。 fast=slow=head; while(true){ if (fast==NULL || fast->next==NULL) return false; else if (fast==slow || fast->next==slow) return true; else{ fast=fast->next->next; slow=slow->next; } 在有序链表中寻找中位数 该方法在不借助计数器变量实现寻找中位数的功能。原理是:快指针的移动速度是慢指针移动速度的2倍,因此当快指针到达链表尾时,慢指针到达中点。程序还要考虑链表结点个数的奇偶数因素,当快指针移动x次后到达表尾(1+2x),说明链表有奇数个结点,直接返回慢指针指向的数据即可。如果快指针是倒数第二个结点,说明链表结点个数是偶数,这时可以根据“规则”返回上中位数或下中位数或(上中位数+下中位数)的一半。 while (fast&&slow) { if (fast->next

C++ 常见面试题目

送分小仙女□ 提交于 2020-02-21 07:05:14
const作用 (1)可以定义const常量,具有不可变性。 (2)便于进行类型检查。(而宏不会进行类型检查)。 (3)可以保护被修饰的东西,防止意外的修改。 (4) 可以节省空间。 static作用 1.隐藏:一个文件中的全局变量在另外一个文件中使用extern声明就能使用,声明了static就不能了 一个函数内的static变量具有全局生命期,但只在这个函数中可见 2.记忆功能和全局生存期 3.默认初始化为0 4.类的静态成员函数是属于整个类而非类的对象,所以它没有this指针 5.不能将静态成员函数定义为虚函数。 6.不可以同时用const和static修饰成员函数。 什么函数不能声明为虚函数 1:只有类的成员函数才能说明为虚函数; 2:静态成员函数不能是虚函数; 3:内联函数不能为虚函数; 4:构造函数不能是虚函数; 5:析构函数可以是虚函数,而且通常声明为虚函数。 指针和引用的区别 本质上:指针是一个新的变量,只是这个变量存储的是另一个变量的地址,我们通过访问这个地址来修改变量。 而引用只是一个别名,还是变量本身。对引用进行的任何操作就是对变量本身进行操作,因此以达到修改变量的目的。 1.引用必须被初始化,指针不必 2.引用初始化以后不能被改变,指针可以改变所指的对象。 3.不存在指向空值的引用,但是存在指向空值的指针。 4."sizeof引用"得到的是所指向的变量(对象

this指针

允我心安 提交于 2020-02-20 17:34:40
this指针 javascript中this指针是动态的,主要是根据当前函数执行上下文及函数调用方式决定的. 以函数方法调用时 this 指针全局或严格模式中为 undefined 以方法调用时 this 是指针当前对象实例的. 以构造函数方式时 this 指向当前创建的实现对象 apply 、 call 、 lambda表达式 可用于绑定this指针. 注意:别绕晕了 函数方式调用 // 以函数方式调用 var x = 2 function test() { console.log(this.x); // 输出 2 } test() // this 为全局对象 windown 以方法调用 // 以方法调用 var x = "x"; let o = { x: 2 }; console.log(o.x); // this指针o实例 构造函数方式 var x = 1; function Test() { this.x = "5x"; } let b = new Test(); console.log(b.x); // this指针b实例对象 apply与call绑定this apply与call接收的函数参数不同,使用方法都是一样的. // apply var b = "b" function test() { console.log(this.b) } let o = { b:22

C++——this指针

谁都会走 提交于 2020-02-20 03:09:17
参考链接: https://blog.csdn.net/ChaoFeiLi/article/details/103612849 https://blog.csdn.net/chenyt01/article/details/51316022 定义:指向当前对象的this指针 this指针:指向当前对象,保存当前对象的地址 类型:类名 * 类成员函数的形参列表中的第一个参数(隐含的参数) int Box::volume(){ return this->length * this->width * this->height; } C++编译器处理为: int Box::volume(Box *this){ return this->length * this->width * this->height; } 先有对象,然后有this指针 编译器的调用过程:box.volume(&box) , this = &box,然后才是成员变量或函数成员 this指针比较特殊的使用方式: 返回当前对象的地址和返回当前的对象 //类声明文件 Box* getAddr();//返回当前对象的地址 Box getSelf();//返回当前对象 //类实现文件 Box* Box::getAddr()//返回当前对象的地址 { return this; } Box Box::getSelf()//返回当前对象