- 博客(50)
- 收藏
- 关注
原创 位运算与嵌入式编程
1、找出下面程序的错误,并解释它为什么是错误的。//The function need set corresponding bit int 0#define BIT_MASK(bit_pos) (0x01<<(bit_pos))int Bit_Reset(unsigned int* val, unsigned char pos){ if (pos >= si...
2018-03-08 10:53:13 395
原创 异常 /C++
一、C++异常分析: 构造函数中抛出异常是有一定必要的,试想如下情况: 构造函数中有两次new操作,第一次成功了,返回了有效的内存,而第二次失败,此时因为对象构造尚未完成,析构函数是不会调用的,也就是delete语句没有被执行,第一次new出的内存就悬在那儿(发生内存泄漏),所以异常处理程序可以将其暴露出来。//.....Base(){ in
2017-11-29 17:28:13 327
原创 友元/C++
面试题目1:写一个程序,设计一个点类Point,求两个点之间的距离。 解析:本题可以使用友元。 类具有封装和信息隐藏的特性。只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的。非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间
2017-11-29 15:38:37 280
原创 预处理/内联函数和宏定义
面试题:内联函数和宏的差别是什么? 答: 内联函数和普通函数相比可以加快程序运行的速度,因为不需要中断调用,在编译的时候内联函数可以直接被镶嵌到目标代码中。而宏只是一个简单的替换。 1. 内联函数要做参数类型检查,这是内联函数跟宏相比的优势。 2. inline 是指嵌入代码,就是在调用函数的地方不是跳转,而是把代码直接写到那里去。对于短小的代码来说inline 增加空间消耗换来的是效率提高
2017-09-05 16:55:12 484
原创 网络安全/端口
面试题:25端口是做什么用的,有什么漏洞么? 答:25端口为SMTP(简单邮件传输协议)服务器所开放,主要用于发送邮件,如今绝大多数邮件服务器都使用该协议。比如在使用电子邮件客户端程序的时候,在创建账户会要求输入SMTP服务器地址,该服务器地址默认情况下使用的就是25端口。 端口漏洞: 利用25端口,黑客可以寻找SMTP服务器,用来转发垃圾邮件。25端口被很多木马程序开放,比如 Aian. An
2017-09-04 17:30:01 1214
原创 计算机网络/网络安全
问题:入侵检测与防火墙有何不同?各有什么优缺点? 1. 防火墙的优点:它能增强机构内部网络的安全性,用于加强网络间的访问控制,防止外部用户非法使用内部网的资源,保护内部网络的设备不被破环,防止内部网络的敏感数据被窃取。防火墙系统决定了哪些内部服务可以被外界访问;外界的哪些人可以访问内部的哪些服务,以及哪些外部服务可以被内部人员访问。 2. 防火墙的缺点:对于发生在内网的攻击无能为力;对于部分
2017-09-04 17:16:03 621
原创 计算机网络/网络协议
面试题:如何编写Socket套接字? 解析:Socket相当于进行网络通信两端的插座,只要对方的Socket和自己的Socket有通信连接,双方就可以发送接收数据了。其定义类似于文件句柄的定义。如果你要编写的是一个服务程序,那么先调用socket()创建一个套接字,调用bind()绑定IP地址和端口,然后启动一个死循环,循环中调用accept()接受连接。对于每个接受的连接,可以启动多线程方式进行
2017-09-02 17:57:56 294
原创 数据库与SQL语言/数据库理论1
1.什么叫做SQL注入式攻击,如何防范? 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串中,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。 防范SQL注入式攻击闯入并不是一件特别困难的事情,只要在利用表单输入的内容构造SQL命令之前,把所有输入内容
2017-09-01 20:43:22 293
原创 操作系统--面试题/内存管理
面试例题1:简述Windows内存管理的几种方式和优缺点: —–Windows内存管理方式主要分为:页式管理, 段式管理, 段页式管理。 一、页式管理的基本原理: 将各进程的虚拟空间划分成若干个长度相等的页(page); 页式管理把内存空间按页的大小划分成片或者页面,然后把页式虚拟地址与内存地址建立一一对应的页表;并用相应的硬件地址变换机构来解决离散地址变换问题。 页式管理采用
2017-08-31 10:09:29 1958
原创 操作系统-面试题/进程与线程
一、进程是不活泼的。 进程从来不执行任何东西,只是线程的容器。线程总是在某个进程环境中创建的,而且它的整个寿命期都在该进程中。这意味着线程在它的进程地址空间中执行代码,并且在进程的地址空间中对数据进行操作。因此,如果在单进程环境中,你有两个或多个线程正在运行,那么这两个线程将共享单个地址空间。这些线程能够执行相同的代码,对相同的数据进行操作。这些线程还能共享内核对象句柄,因为句柄表依赖于每个进程而
2017-08-29 19:23:22 519
原创 将二叉搜索树转换成一个排序的双向链表
题目:将二叉搜索树转换成一个排序的双向链表。提示:要求不能创建任何新的结点,只能调整树中结点指针的指向,也就是left当prev,right当next。–中序线索化的变型。 1、由于要求链表是有序的,可以借助二叉树中序遍历,因为中序遍历算法的特点就是从小到大访问结点。当遍历访问到根结点时,假设根结点的左侧已经处理好,只需将根结点与上次访问的最近结点(左子树中最大值结点)的指针连接好即可。进而
2017-07-30 18:31:41 478
原创 数据结构面试题/判断一棵树是否是完全二叉树
二叉树: 1.满二叉树:在一棵二叉树中,如果所有分支节点都存在左子树和右子树,并且所有叶子节点都在同一层上。 2.完全二叉树:如果一棵具有N个结点的二叉树的结构与满二叉树的前N个结点的结构相同,称为完全二叉树。 //判断一棵二叉树是否是完全二叉树--利用层序遍历来处理->关键:找第一个度不为2的结点->后序结点:如果有孩子则不是完全二叉树,否则是 bool IsCompleteBin
2017-07-29 20:09:52 5568
原创 数据结构/实现二叉树的前序/中序/后序非递归遍历
//先序遍历--非递归版本 //1.取当前结点--访问结点--出栈 //2.保存右子树 //3.保存左子树 void PreOrder_Nor() { cout << "PreOrder_Nor: " << endl; if (NULL == _pRoot) return; stack<N
2017-07-29 10:01:20 401
原创 数据结构面试题/判断一棵二叉树是否是平衡二叉树
AVL树概念:如果一棵二叉搜索树是高度平衡的,它就是AVL树。如果它有N个结点,其高度可保持在O(lgn),平均搜索时间复杂度O(lg(n)). 一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树: 1.它的左右子树都是AVL树; 2.左子树和右子树高度之差(简称平衡因子)的绝对值不超过1. 先定义一个二叉树的结构体:template<class K, class V> //键值队
2017-07-27 23:24:10 654
原创 数据结构面试题/求一棵二叉树的镜像
求树的镜像的过程其实是在遍历树的同时交换非叶节点的左右子节点。 二叉树的节点定义如下:struct BinaryTreeNode //创建树中的每个结点{ BinaryTreeNode(const T& data) :_data(data) ,_pLeft(NULL) ,_pRight(NULL) {} T _data
2017-07-27 12:18:58 320
原创 数据结构面试题/求二叉树的高度/销毁一棵二叉树-->
template<class T>struct BinaryTreeNode //创建树中的每个结点{ BinaryTreeNode(const T& data) :_data(data) ,_pLeft(NULL) ,_pRight(NULL) {} T _data; //结点的值 BinaryTreeNode<
2017-07-23 12:43:49 538
原创 数据结构面试题/求二叉树叶子节点的个数/求二叉树第k层的节点个数
题目:求二叉树叶子节点的个数/求二叉树第k层的节点个数 二叉树如图所示: #pragma once#include<stdlib.h>#include<queue>#include<stack>#include<iostream>using namespace std;template<class T>struct BinaryTreeNode //创建树中的每个结点{
2017-07-23 12:25:17 1448
原创 算法---面试题/--求N的阶乘N!中末尾0的个数
】–给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=3 628 800,N!的末尾有两个0 分析: 1)、如果N是一个很大的数,它的阶乘可能已超出计算机所能计算的最大范围,因此可能会导致溢出。我们换个角度想, N!=1×2×3×4×5×6×··· ×N ,我们可以对N!进行分解质因数,即 N!=(2^x)×(3^y)×(5^z) ·········· 可以看到
2017-07-22 14:35:27 1440
原创 数据结构面试题/实现一颗二叉树的层序遍历
题目:实现一颗二叉树的层序遍历 一、二叉树(Binary Tree)的定义: 二叉树是另一种树型结构,它的特点是每个结点至多只有两棵子树,(即二叉树中不存在度大于2的结点),并且二叉树的子树有左右之分,其次序不能任意颠倒。 二、二叉树的性质: 1、在二叉树的第i层上至多有2^(i-1)个结点(i>=1); 2、深度为k的二叉树至多有2^k - 1个结点,(k>=1); 3、对任何一棵二叉
2017-07-22 11:54:18 660
原创 C/计算一个整数二进制位中1的个数
计算一个整数二进制位中1的个数。要求效率尽可能的高。且能正确求正数和负数的二进制中1的个数。 代码:#pragma once#include<stdio.h>#include<stdlib.h>//计算一个整数二进制位中1的个数。要求效率尽可能的高。且能正确求正数和负数的二进制中1的个数。 //32位,0 --00000000 00000000 00000000 00000000//
2017-07-21 11:08:06 384
原创 数据结构面试题/元素出栈,入栈顺序的合法性
题目:元素出栈、入栈顺序的合法性。如:入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1),则合法。入栈的序列(1,2,3,4,5),出栈序列为(4,5,2,3,1),则不合法。 栈(stack)——是限定在表尾进行插入或删除操作的线性表,又称为先进后出的线性表。 定义一个栈s, 入栈序列为stack_in, 出栈序列为stack_out,长度分别为len_in 和len_out
2017-07-20 15:30:39 612
原创 C++/设计一个类
–1.设计一个类不能被继承 2.设计一个类只能在堆上创建对象。 3.设计一个类只能在栈上创建对象。 1.设计一个类不能被继承解法一:将构造函数设为私有函数 在C++中,子类的构造函数会自动调用父类的构造函数,子类的析构函数也会调用父类的析构函数。要想一个类不能被继承,只要把它的构造函数和析构函数都设置为私有函数。那么当一个类试图从那里继承时,势必会因为调用构造函数和析构函数而导致编译错误。
2017-07-17 11:44:46 1551
原创 链表面试题3/链表带环问题--判断链表是否带环?
求单链表是否存在环,环长,带环链表长 给定一个单链表,只给出头指针h: 1、如何判断是否存在环? 2、如何知道环的长度? 3、如何找出环的连接点在哪里? 4、带环链表的长度是多少? 解法: 1、对于问题1,使用追赶的方法,设定两个指针slow、fast,从头指针开始,每次分别前进1步、2步。如存在环,则两者相遇;如不存在环,fast遇到NULL退出。 2、对于问题2,记录下问题1的碰
2017-07-17 10:58:46 378
原创 链表面试题/逆置/反转单链表+查找单链表的倒数第k个节点
一、逆置/反转单链表 逆置一个单链表和从尾到头打印不一样,打印不改变节点的位置,只是将数据反着打印一遍,而逆置就是要改变节点的位置。 可以先创建一个空节点,然后从第一个开始每次在单链表上拿一个节点,前插给创建的节点,单链表的头结点往后移,创建的新节点往前移。当单链表为空的时候,也就逆置完了。 这里面我们需要三个指针分别是cur,用来顺序遍历整个链表,nextNode指针用来保存逆置的头结
2017-07-15 16:41:49 755
原创 合并两个有序链表--实现1+2+3+....+n,时间复杂度为O(1)
1、合并两个有序链表,合并以后的链表依旧有效 C语言实现 链表结点定义如下:typedef int DataType;typedef struct Node{ DataType _data; struct Node* _pNext;}Node,*PNode;实现代码:void InitList(PNode* pHead) //初始化单链表{ assert(pHea
2017-07-14 16:19:01 3529
原创 Linux脚本编程/shell语法和shell进度条的编写
一、shell脚本的基本语法 1、条件测试:在shell脚本中,进行测试最常用的命令是test和[ 1).比较条件的成功与否,由test和 [ 的命令的退出码决定; 2).在shell脚本中,条件成立于不成立,与C语言正好相反,shell脚本认为0为真,非0为假; 3).shell脚本认为一行是一条命令,所以test是命令,后面的是参数或选项,用空格隔开; 4).shell脚本中进行整数
2017-07-06 17:02:54 470
原创 Linux 中shell脚本/eval调研
eval可以读取一连串的参数,然后按照参数特性来执行。参数数目不限,彼此之间用分号隔开。 eval会对后面的命令进行两遍扫描,如果第一遍扫描后,命令是个普通命令,则执行此命令;如果命令中含有变量的间接引用,则保证间接引用的语义。也就是说,eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令。因此,eval命令适用于那些一次扫描无法实现其功能的变量。 eval 执行以下两个步骤:
2017-07-03 16:07:02 400
原创 Linux网络编程/poll服务器
一、编写poll服务器 对Pool服务器的了解: pollfd结构包含了要监视的event和发生的event,不在使用select”参数-值”传递的方式,同时,pollfd并没有最大数量限制。和select函数一样,poll返回后,需要轮询pollfd来获取就绪的描述符。 #include<stdio.h>#include<poll.h>int main(){ struct po
2017-06-30 15:59:53 396
转载 linux网络编程/tcp_server中server bind失败原因的调研
问题模型:server1为服务端,在本地的9999端口监听,server2相对server1是客户端,server2启动后首先向server1发起连接,然后再8888端口监听。程序代码不在列出。先后启动server1、server2,然后查看当前连接,如图1所示。 图1.建立连接,正常 之后强制结束server1(ctrl+c),再次查看当前连接状态,如图2所示。图2.server1主动关
2017-06-26 11:34:13 16380
原创 linux网络编程/多线程多进程服务器与进程线程池
一、多进程服务器 1、服务器端代码: #include<stdio.h>#include<stdlib.h>#include<netinet/in.h>#include<sys/socket.h>#include<sys/types.h>#include<arpa/inet.h>#include<string.h>//./tcp_server 127.0.0.1 8080static
2017-06-26 00:17:23 571
原创 linux网络编程/TCP三次握手与四次挥手
一、三次握手在 TCP/IP 协议中,TCP 协议提供可靠的连接服务,采用三次握手建立一个连接。 第一次握手:建立连接时,客户端发送 syn 包到服务器,并进入 SYN_SEND 状态,等待服务器确认; 第二次握手:服务器收到 syn 包,必须确认客户的 SYN,同时自己也发送一个 SYN 包,即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态; 第三次握手:客户端收到服务器的
2017-06-20 11:40:47 269
原创 linux/URG-&-PSH/调研tcp定时器/
一、URG-&-PSH 1、紧急标志URG(U):占1位,当URG=1时,表示紧急指针字段有效。通知发送方本数据报文段中含有紧急数据,需要马上传输,这时发送方不会等到缓冲区满再发送,而是直接优先将该报文段发送出去。 2、推送标志PSH(P):占1位,PSH=1时,表示当前报文段需要请求推送(Push)操作,即接收方TCP收到推送标志位为1的报文时 ,就立即提交给接收的应用进程,而不必等到整个缓存
2017-06-20 10:18:18 373
原创 linux/端口分类调研
一、 .端口的概念在网络技术中,端口(Port)包括逻辑端口和物理端口两种类型。物理端口指的是物理存在的端口,如ADSL Modem、集线器、交换机、路由器上用 于连接其他网络设备的接口,如RJ-45端口、SC端口等等。逻辑端口是指逻辑意义上用于区分服务的端口,如TCP/IP协议中的服务端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等。由于物理端口和逻辑
2017-06-19 17:25:48 378
原创 linux/NAT技术与代理服务器调研
一、NAT技术 定义:NAT英文全称是 Network Address Translation,即网络地址转换,是一种IETF标准,允许一个机构以一个地址出现在Internet上。NAT将每个局域网节点的地址转换成一个Internet地址,反之亦然。 用途: 1)、连接到Internet,但却没有足够的公用Internet地址分配给内部主机。 2)、接到一个需要重新分配地址的ISP. 3)
2017-06-13 11:29:28 438
原创 linux CRC校验
CRC即循环 冗余校验码:是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。 CRC校验实用程序库在数据存储和数据通信领域,为了保证数据的准确,就不得不采用检错的手段. 下面我们通过一个简单的例子来说明循环冗余检验的原理: 在发送端,先把数据划分为组,假定每组k个比特(也就是每组K为)。现假定待传送的数据M = 101001(k=6).CR
2017-06-12 17:10:32 1244
原创 ARP协议和arp脚本
一、ARP协议 —地址解析协议 在网络通信时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址,而数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接弃。因此在通信前必须获得目的主机的硬件地址。ARP协议就起到这个作用。 源主机发出arp请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少”,并将这个请求广
2017-06-12 16:13:27 649
原创 守护进程
守护进程也称精灵进程,是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。linux大多数服务器就是用守护进程实现的。 linux系统启动时会启动很多系统服务进程,这些系统服务进程没有控制终端,不能直接和用户交互。其他进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止,但系统服务进程不受用户登录注销的影响,它们一直在运行,这种进程有一个名称叫守
2017-06-08 20:46:28 376
原创 crond命令和crontab命令调研
一、crond 简介 crond是linux用来定期执行命令或指定程序任务的一种服务。安装完操作系统后,默认会启动crond任务调度服务。crond服务会定期检查系统中是否有要执行的任务。如果有要执行的任务则自动执行该任务。crond定时任务服务就像我们早上使用的闹钟一样。 查看crond服务状态: 命令: service crond status 启动crond服务:
2017-06-07 17:27:39 347
原创 文章标题
一、概念: 1、**可重入函数 1)、函数被不同的控制流程调用,有可能在第一次调用还没返回时就再次进入该函数,这称为重入。 2)、insert函数访问一个全局链表,有可能因为重入而造成错乱,像这样的函数称为不可重入函数。如果一个函数符合以下条件之一则是不可重入的: a、调用了malloc/free,因为malloc也是用全局链表来管理堆的; b、调用了标准I/O库函数。标
2017-04-27 10:52:15 226
原创 死锁的定义、产生原因、必要条件、避免死锁和解除死锁的方法
一、死锁产生的原因: 1)、因为系统的资源不足,不能满足进程的资源请求,会导致多个线程同时争夺一个资源 2)、进程运行推进的顺序不合适 3)、资源分配不当,有的进程资源分配太少,会因为争夺资源而陷入死锁 二、死锁产生的场景: 1)、多个线程:彼此申请对方资源不足而导致的死锁,A申请B的锁的时候,因为锁被占用所以会把A挂起等待B释放锁,同时B申请A的 锁,同样因为A的锁锁被占用,B会被挂起等
2017-04-26 19:46:58 867
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人