指针

C 语言&GCC

末鹿安然 提交于 2020-03-05 23:30:01
C 语言&GCC C 语言--指向char和int的指针 GCC 预处理,编译,汇编 链接 动态链接 静态链接 本文是基于韦东山视频的学习笔记 C 语言–指向char和int的指针 我也不知道怎么说。 64位机,char是1字节,int是4字节,凡是指针都是8字节 32位机,char是1字节,int是4字节,凡是指针都是4字节 看得出,指针就是存放地址的,会根据系统的寻址能力变化。 没啥说的。 GCC 预处理,编译,汇编 一个c文件摆在面前,最简单的gcc编译命令就是 gcc hello.c 不是说不行,但是这样输出的可执行文件名就会是“a.out”,不明白的还以为多了个垃圾文件出来。所以一般怎么说,也会加个选项 -o ,用来命名输出的文件名。比如: gcc -o hello hello.c //hello就是输出文件名字 一般来说,一个执行文件要经过预处理 1 ,编译 2 ,汇编 3 ,链接 4 四个步骤的 hello.c hello.i hello.s hello.o 可执行文件 hello gcc -E -o hello.i hello.c gcc -S -o hello.s hello.i gcc -c -o hello.o hello.s gcc -o hello hello.o 预处理 编译 汇编 链接 hello.c hello.i hello.s hello.o

移动构造函数

人走茶凉 提交于 2020-03-05 23:22:32
https://blog.csdn.net/gxb0505/article/details/53572761 如果指针所指向非常大的内存数据的话,则拷贝构造的代价就非常昂贵,会极大地影响性能。C++11提供一种简洁解决方法:移动构造函数,即是在用原对象指针对新对象指针进行赋值后,将原对象成员指针置为空指针,使得其无法指向内存数据,从而保证在析构的时候不会产生内存泄漏。这样既不用分配新内存,也不会产生内存泄漏,从而很好地解决了上述问题。 来源: CSDN 作者: xiaoxiao落木 链接: https://blog.csdn.net/qq_28133013/article/details/104680450

LeetCode刻意练习05--最接近的三数之和

て烟熏妆下的殇ゞ 提交于 2020-03-05 23:01:03
最接近的三数之和 题目: 给定 一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。 返回 这三个数的和。假定每组输入只存在唯一答案。 思路: 1.将给定的数组进行排序 2.遍历数组,并且将第一个元素置为nums[i] 3.定义两个指针,左指针为 i+1,右指针为数组最后一个元素的下标。 4.看他们的和,如果他们的和比我们想要的和小,那么左指针右移,如果比我们想要的大,那么右指针左移。如果有更接近的三数之和,那么我们更新sum 优化: 去除重复元素 public int threeSumClosest ( int [ ] nums , int target ) { Arrays . sort ( nums ) ; // int closest_num=10000; int closest_num = nums [ 0 ] + nums [ 1 ] + nums [ 2 ] ; for ( int i = 0 ; i < nums . length - 2 ; i ++ ) { int l = i + 1 , r = nums . length - 1 ; while ( l < r ) { int sum = nums [ l ] + nums [ r ] + nums [ i ] ; if (

Linux 二进制漏洞挖掘入门系列之(五)UAF 漏洞分析与利用

微笑、不失礼 提交于 2020-03-05 22:49:42
0x10 UAF(Use After Free) 漏洞原理 这里,需要先介绍一下堆分配内存的原则。ptmalloc 是 glibc 的堆管理器,前身是 dlmalloc,Linux 中进程分配内存的两种方式: brk 和 mmap 。 当程序使用 malloc 申请内存的时候,如果小于 128K,使用 brk 方式,将数据段(.data)的最高地址指针_edata往高地址推;如果大于 128K,使用 mmap 方式,堆和栈之间找一块空闲内存分配 。同样的,当用户释放内存时, ptmalloc 也不会立马释放空间, 当应用程序调用 free() 释放内存时,如果内存块小于256kb,dlmalloc将内存块标记为空闲状态。 Use After Free 就是其字面所表达的意思,当一个内存块被释放之后再次被使用,可能会导致意想不到的后果。分为以下三种情况 1 内存块被释放后,其对应的指针被设置为 NULL , 然后再次使用,自然程序会崩溃。 内存块被释放后,其对应的指针没有被设置为 NULL ,然后在它下一次被使用之前,没有代码对这块内存块进行修改,那么程序很有可能可以正常运转。 内存块被释放后,其对应的指针没有被设置为 NULL,但是在它下一次使用之前,有代码对这块内存进行了修改,那么当程序再次使用这块内存时,就很有可能会出现奇怪的问题。 学过 C 语言的人应该都知道,垂悬指针

C语言作业

不想你离开。 提交于 2020-03-05 22:39:22
指针 1.代码文件列表 视频笔记: 问题: 1.指针p与*p之间的区别:p内部是代表地址;*p指向的地址中所对应变量的值。 2.int* p与int *p区别:没有任何区别,都代表指针变量p。 3.int *p,q;的意思:第一个代表一个指针,第二个代表一个普通变量; 4.相同类型指针间可以做的运算解决:比较大小,可以赋值,相加减。 pta作业 1.指针只能用整型的吗?网上搜索得到答案:可以里使用各种类型,例如:double,float; 2.寻找最值问题不是很了解。后查书得到答案:通过for语句进行循环遍历所有的的项,进行逐个比较。 3.通过指针返回值,通过return返回状态。的使用不是非常了解。 来源: https://www.cnblogs.com/jhy12/p/12422929.html

Data Structures[翻译]

a 夏天 提交于 2020-03-05 14:24:52
Data Structures 【原文见: http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=dataStructures 】 作者 By timmac TopCoder Member 翻译 农夫三拳@seu drizzlecrj@gmail.com 即使计算机能够毫不夸张的每秒执行上百万次的数学运算,当一个问题变得庞大且复杂时,性能仍然是一个很重要的考虑方面。最至关紧要的关于快速解决问题的方面之一就是数据在内存中是如何存储的。 为了举例说明这点,可以试想你进入一个图书馆去查找某个学科的一本书。最有可能的是你能够使用一些电子参考或者在最坏情况下,有一个卡片目录来帮助你找到你想要的书的名称和作者。由于书籍都是按目录进行排放的并且在每一个目录中是按照作者的姓名排序的,因此这是一个直接并且轻松的过程,那么然后你就可以在书架上找到你想要的书了。 现在,假定你去图书馆找一本特定的书,然而这里没有排放好的书架,只有在房间角落有一些排成行的袋子,里面放满了可能相关可能不相关的书。这样就可能需要数个小时甚至数天来找到你需要的书了,这是一个对比性强的道理。这就是数据在没有存储为与应用相关的格式时软件运行的情况。 简单的数据结构(Simple Data Structures) 最简单的数据结构是原生的变量。他们存放单个值,并且使用中受限

原生JS实现双向链表

旧街凉风 提交于 2020-03-05 14:01:35
1.前言 双向链表和单向链表的区别在于,在链表中,一个节点只有链向下一个节点的链接,而在双向链表中,链接是双向的:一个链向下一个元素,另一个链向前一个元素,如下图所示: 从图中可以看到,双向链表中,在每个节点 Node 里有 prev 属性(指向上一个节点的指针)和 next 属性(指向下一个节点的指针),并且在链表中也有 head 属性(用来存储链表第一项的引用)和 tail 属性(用来存储链表最后一项的引用)。 2.代码实现 首先,我们可以先创建一个双向链表DoublyLinkedList类: //创建一个Node辅助类,用来生成节点 class Node{ constructor(value){ this.value = value; this.next = null; this.prev = null; } } class DoublyLinkedList{ constructor(){ this.head = null; this.tail = null; this.length = 0; } append(element){ } find(value){ } insert(position,element){ } remove(value) { } removeAt(position){ } size(){ } isEmpty(){ } nextPrint() { }

Java 集合小结

倖福魔咒の 提交于 2020-03-05 12:26:33
1.List 1.1 ArrayList 以数组实现。节约空间,但数组有容量限制。 超出限制时会增加50%容量,用System.arraycopy()复制到新的数组。因此最好能给出数组大小的预估值。默认第一次插入元素时创建大小为10的数组 。 按数组下标访问元素-get(i)、set(i,e) 的性能很高,这是数组的基本优势。 如果按下标插入元素、删除元素- add(i,e)、 remove(i)、remove(e),则要用System.arraycopy()来复制移动部分受影响的元素 ,性能就变差了。 越是前面的元素,修改时要移动的元素越多。直接在数组末尾加入元素-常用的add(e),删除最后一个元素则无影响。 1.2 LinkedList 以双向链表实现。链表无容量限制,但双向链表本身使用了更多空间,每插入一个元素都要构造一个额外的Node对象,也需要额外的链表指针操作。 按下标访问元素-get(i)、set(i,e) 要悲剧的部分遍历链表将指针移动到位 (如果i>数组大小的一半,会从末尾移起)。 插入、删除元素时修改前后节点的指针即可,不再需要复制移动。但还是要部分遍历链表的指针才能移动到下标所指的位置。 只有在链表两头的操作-add()、addFirst()、removeLast()或用iterator()上的remove()倒能省掉指针的移动。 Apache

指针(六)

為{幸葍}努か 提交于 2020-03-05 08:47:22
今天继续对指针进行探讨,请看下面: 函数指针: 下面通过一个程序,简单明了的对函数指针有个基本认识: #include <stdio.h> void test(int n) { printf("test %d ...\n", n); } int main(void) { void (*f)(int); // 这里的f就是函数指针变量 void (*f2)(int); // 这里的f就是函数指针变量 // 以下两种写法是等价的 f = &test; f2 = test; // 以下两种写法也是等价的 f(100); // 调用函数 (*f2)(200); // 调用函数 return 0; } 运行: 需要特别说明的是: void (*f)(int);代表的是函数指针变量,但是 void* f(int);则代表的含义就完全不一样了,由于()运算符的优先级比*要高,所以f(int)代表一个函数,void*代表函数的返回值。 下面再通过几个小例子,来进一步加深对函数指针的认识: 示例 1: 运行结果: 如果不用函数指针,也不可能用一个函数可以包含多个函数的功能,从代码复用的角度来说,用它也是非常好的体现。 示例 2 【它有一个很重要的意义,需好好理解】 : 这个示例主要是用到系统函数, 对结构体数组元素进行排序 ,这个函数为 qsort ,通过man帮助查看一下: 具体代码如下:

5.2 智能指针(smart pointer)

点点圈 提交于 2020-03-05 08:26:34
于头文件<memory> 1. shared_ptr实现共享拥有(shared ownership),标准库还提供了weak_ptr bad_weak_ptr和enable_shared_from_this等辅助类 2. unique_ptr实现独占式拥有(exclusive ownership/strict ownership), 3. 特点 shared_ptr和weak_ptr内部需额外的辅助对象(引用计数器等),因此无法完成一些优化操作 unique_ptr不需要这些额外的开销(unique_ptr特殊的构造和析构、copy语义的消除),unique_ptr消耗的内存和native pointer相同,还可使用function object(包括lambda)作为deleter达成最佳优化,甚至零开销。 smart pointer并不保证线程安全,虽然它有适用某些保证。 目录 share_ptr weak_ptr unique_ptr share_ptr shared_ptr基本使用 //1. 直接初始化 shared_ptr<string> test(new string("nico")); shared_ptr<string> test{new string("nico")}; //2. 使用便捷函数make_shared(),快、安全、使用一次分配 shared