自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 收藏
  • 关注

原创 select源码剖析(Linux2.6.11)

select是在一定时间内,监听用户注册的可读、可写、异常事件。它的可读、可写、异常事件分别对应着文件描述符的集合。当有事件发生的时候,内核就会修改这些参数来告诉应用程序哪些文件描述符以及就绪了。这样的话下次调用select时就需要重新设置可读、可写、异常事件的文件描述符。 select系统调用的顺序是: select () -> sys_select() -> do_select...

2018-08-16 20:16:40 497

原创 C语言的数组和STL的vector的互相转换

折腾了好久这个数组和vector的转换,今天终于弄明白了。。。1.数组arr转vectorint arr[]={1,2,3,4,5,6}; int len = sizeof(arr)/sizeof(arr[0]); vector<int> vec; for(int i=0;i<len;++i) { vec.push_bac...

2018-08-14 22:01:01 4237

原创 单链表面试题总结(二)

1.输出链表中倒数第k个节点 思想:先让快指针向前走k-1步,然后快慢指针同时开始走,快指针走到末尾时,慢指针正号走到倒数第k个节点。这里的k是从1开始的。 易错点:忘记把k设置为unsigned类型;向前走k步的时候忘记判断 ListNode* FindKtoTail(ListNode * phead,unsigned int k) { if(phe...

2018-08-11 23:57:42 201

原创 单链表面试题总结(一)

首先是链表的结构struct ListNode{ ListNode(int x):mval(x),pnext(NULL){} int mval; ListNode * pnext;};初始化 void InitList(ListNode *phead) { if(phead == NULL) return ; ...

2018-08-11 23:36:35 197

原创 C语言中有关字符串的编程题

(1)字符串拷贝strcpy 特点:只能拷贝字符串,遇到\0停止拷贝char* MyStrcpy(char* dst,const char* src){ assert(dst != NULL && src != NULL); char* dstaddr = dst;//如果要返回值,必须重新定义一个指针指向目标指针,然后返回定义的这个指针,因为本来的ds...

2018-08-06 09:15:30 6114 1

原创 八大排序之 归并 直接插入 希尔排序

(1)归并排序 思想:先让一个元素有序,再让两个元素有序,再让4个元素有序……,最后总会全部有序。 时间复杂度:平均 O(nlogn) 最好 O( nlogn) 最坏 O(nlogn) 空间复杂度:O(n) 稳定性:稳定void Merge(int *arr,int *tmp,int left,int mid,int right){ int i=left;//第一个归...

2018-08-05 16:21:38 191

原创 八大排序之 快速排序

快速排序思想:选择一个基准,下标h指向最后一个元素,下标l指向第一个元素。下标h从后向前遍历,比基准小的数字放在前面,下标l从前向后遍历,比基准大的放后面。重复以上操作,直到 l、h相遇,相遇点即为基准要放的位置。直到只剩一个数字的时候,停止划分。 时间复杂度:平均O(nlogn) 最好 O(nlogn) 最坏O(n^2) 空间复杂度:O(logn) 稳定性:不稳定 优点:越无序越快...

2018-08-05 09:09:54 420

原创 智能指针

如 int* p = new int;//p是裸指针因为有时忘记delete或者遇到return导致程序退出 智能指针的出现 是为了解决内存泄露,它利用了栈上的对象出了作用域就会自动析构的特点。所以它的设计思想是如果能在堆上手动开辟,然后由系统释放,那就很完美了。 智能指针的分类:C++98的智能指针:auto_ptr C++11的引入智能指针:scoped_ptr,unique_p...

2018-08-02 16:42:48 198

原创 TCP拥塞控制和TCP流量控制

TCP拥塞控制提高网络利用率,降低丢包率,并保证网络资源对每条数据流的公平性,这就是拥塞控制。 拥塞控制包括四部分:慢启动、拥塞避免、快速重传、快速恢复 发送端向网络一次连续写入的数据量,我们称为SWND(Send Window,发送窗口).但是发送端最终以TCP报文段来发送数据,所以SWND的大小限制了能连续发送的TCP报文段数量。这些TCP报文段的最大长度(仅数据部分)称为SMSS(S...

2018-07-30 18:57:07 13604 2

原创 HTTP协议详解

1.什么是Http协议无状态协议? 怎么解决Http协议无状态协议? 无状态是指当客户端的HTTP请求完成以后,客户端再发送一次HTTP请求,HTTP并不知道当前客户端是一个”老用户“。 可以使用Cookie来解决无状态的问题,Cookie就相当于一个通行证,第一次访问的时候给客户端发送一个Cookie,当客户端再次来的时候,拿着Cookie(通行证),那么服务器就知道这个是”老用户“。2...

2018-07-29 09:27:53 423

原创 ICMP协议详解

ICMP协议的作用:ICMP协议是IP协议的一个辅助,它可以传递差错报文以及其他信息Ping用到的是ICMP协议,不是端口。1.ICMP协议: ICMP经常被认为是IP层的一个组成部分,它传递差错报文以及其他需要注意的信息。ICMP协议经常被IP层或者更高层协议使用,比如TCP、UDP。ICMP报文有两种类型:差错报告报文和查询报文。 2.ICMP时间戳请求 ...

2018-07-26 23:18:14 24204

原创 TCP连接的建立和关闭

TCP三次握手、四次挥手全过程(状态和具体的报文) 三次握手: (1)首先是服务器通过listen系统调用进入LISTEN状态,被动等待客户端连接 (2)客户端通过connect系统调用主动与服务器建立连接,发生同步报文段SYN,使自己转移到SYN_SENT状态 connect系统调用失败的两个原因:目标端口不存在或者被占用;目标端口虽然存在,但在超 ...

2018-07-26 09:33:29 1033

原创 TCP/UDP协议详解

TCP协议详解TCP连接是全双工的,即双方的数据读写可以通过一个连接执行。 TCP协议的连接是一对一的,所以基于广播和多播(目标是多个主机地址)的应用程序不能使用TCP服务。 而无连接的UDP协议适合于广播和多播。TCP和UDP的区别:TCP为应用层提供可靠的、面向连接的、基于流的服务 (1)①TCP采用发送应答机制,发送端发送的每个TCP报文段都必须得到接收方的应答,才认为这个...

2018-07-25 20:04:24 340

原创 【剑指offer】调整数组顺序使奇数位于偶数前面

最近开始刷《剑指offer》,说实话开始的有点晚了,应该早点开始的。刷题顺序没有按照书上的顺序来,保证刷完即可。题目:调整数组顺序使奇数位于偶数前面首先,【1】这个题没有要求奇数相对于原数组奇数的位置不变和偶数相对原数组的位置不变,【2】也没有要求不能重新再创建数组,所以基于上述两方面这个题有多种解法。1.重新定义一个vector数组,用push_back()先将奇数插入新数组,再用一...

2018-04-20 20:45:04 229

原创 进程间通讯

进程间通讯的主体是进程,方式有信号、管道(有名管道、无名管道)、信号量、消息队列、共享存储(共享内存)、套接字。管道:在内存上开辟一块空间,用文件描述符指向这段空间。一、有名管道有名管道:在文件系统的文件目录树上存在的一个文件标识,即文件名。但是管道文件不占据磁盘空间,需要传递的数据缓存在内存区域。 inode是存在磁盘上的,而且管道有大小。一般的存储设备有寄存器(一个寄存器最多只能存4个字节)、

2017-11-12 16:22:57 196

原创 父子进程间文件共享

fork函数调用一次,返回两次。在新创建的过程中返回一次,返回值为0.在原来的进程中返回一次,返回值是新进程的pid。 通过fork函数创建的进程为新进程的父进程。即就是,通过fork创建的进程与原进程是父子关系。孤儿进程:当父进程结束以后,子进程未结束,子进程的父进程变为init。init这个进程是守护进程,它负责处理这些孤儿进程退出以后的一些状态。 僵死进程:(1)父进程未结束,子进程结束,

2017-11-01 17:13:38 2232

原创 Linux文件操作

文件操作的函数有很多,我简单总结以下几种:一、系统调用函数每个运行中的程序被称为进程,它有一些与之关联的文件描述符。有多少文件描述符可用取决于系统的配置情况。当一个程序开始运行它时,它一般会有3个已经打开的文件描述符。 0:标准输入 1:标准输出 2:标准错误1.打开或创建一个文件 头文件: #include <fcntl.h>int open(const *pathname,int fla

2017-10-28 19:53:09 264

原创 Linux 下何时输出缓冲区的问题

缓冲区:由多个以不同速度或优先级运行的硬件或程序进程共享的数据存储区,在其中暂时保存数据。输出缓冲区的4个条件: 1.遇到“\n”,立即刷新缓冲区。 2.程序调用fflush函数刷新缓冲区 3.程序以exit结束,缓冲区会刷新。如果以_exit结束,缓冲区数据会被直接清空。 4.缓冲区满,也会将缓冲区数据刷新出来。1.遇到“\n”输出例1:printf()里面不加“\n”运行结果: 分析:

2017-10-25 15:19:28 2611 1

原创 进程的加载过程

假如有一个可执行程序,它有自己的大小。将可执行程序加载到内存空间的各种方法,以下是我们便于理解的一种方法。如上图,如果想再加载一个程序进去,理论上空间够用,但实际上放不进去,因此这种管理方案浪费的内存较大,会产生外部碎片。因此我们可以使用页表来对内存进行管理。页表:操作系统会为每一个进程维护一个页表,页表主要记录其加载时每个块对应的页号。

2017-10-21 21:19:03 5863 2

原创 makefile的使用

Makefile 关系到整个工程的编译规则,一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为Makefile就像一个shell脚本一样,其中也可以执行操作系统的命令。1.Makefile的优势 (1)自动化编译,一次写好,永久使用,如果修改也

2017-10-19 20:21:47 263

原创 中缀 前缀 后缀表达式 相互转换

1.中缀表达式:便于人看 2.前缀表达式(波兰式):运算符在前面,运算数在后面 3.后缀表达式(逆波兰式):运算数在前面,运算符在后面中缀- - - ->前缀: 优先级先乘除再加减,入栈方向从右往左,栈外的符号想进栈,栈内的符号想出栈。栈外左括号不能进栈,栈外右括号优先级最高。栈内右括号优先级最低。 中缀- - - ->后缀: 简单规则:优先级先乘除再加减,入栈方向从左往右,栈外的符号想进

2017-09-29 21:14:05 2744 1

原创 排序算法总结(一)

排序方法分为两大类:内部排序和外部排序 内部排序分为插入排序、选择排序、交换排序、归并排序、基数排序1.插入排序 将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表。 此处采用不用哨兵位的方法:void InsertSort(int arr[],int len){ for(int i=1;ilen;i++) //默认第一个元素已经排好序 {

2017-09-12 21:19:19 144

原创 二维数组 C语言优先级记忆Tips

引入: 一维数组的定义: 动态创建一维数组 :int * arr=(int * )malloc(10* sizeof(int));1.二维数组的定义: 如创建3行4列的数组 第一种方法:int main(){ int count=0; int** arr=(int** arr)malloc(3*sizeof(int*));//开辟二维数组,3行 for(int i=0;

2017-08-21 22:23:46 590

原创 C语言习题

1.假设在n进制下,下面的等式成立,567*456=150216,则n的值是() A.9 B.10 C.12 D.18 解析: 首先可以排除选项B,因为肯定567*456!=150216 将等式两端转换为n进制 左侧=(5* n^2+6

2017-08-19 22:21:17 281

原创 在C和C++中NULL的区别

1.在c和c++中特定指针与通用指针相互赋值的问题特定指针 如:int ,char ,float * 通用指针 如:void*int main(){ int a=10; int *p=&a; char b='y'; char *cp=&b; void *vp=cp; //特定指针赋给通用指针 //cp=vp; //通用指针赋给特定指针,在c中可以,在c++中不可以

2017-07-10 12:10:39 669

原创 C语言 求素数、排序算法

一、素数 1.从2到n-1之间依次检查是否有n的因数 题目:判断一个数是否是素数bool Isprimer(int n){ for(int i=2;i<n;i++) { if(n % 2==0) { return false; } } return true;}int main(){

2017-06-02 11:40:20 3617

原创 C语言 多级指针 解引用

1.解引用int main() {int a = 10;int b = 20;printf("%d %d\n",a,b);//10 20int *p = &a;//p里保存a的地址*p = 100;//对p解引用,将p指向的地址的内容赋为100p = &b;//p指向b*p = 200;//将p指向的地址的内容赋为200printf("%d %d\n",a,b);// 100 200i

2017-05-21 17:36:26 1309

原创 C语言基础知识之二

1.switch是多分支选择语句 switch(整型表达式) { case 常量表达式1 : 语句块1;break; case 常量表达式2 : 语句块2break; default: 语句块;break; } 和case标签值相同时进入,遇到break或switch已结束时跳出 default、case1、case2

2017-05-10 21:28:13 271

原创 C语言基础知识之五

C语言允许用户自己建立有不同类型数据组成的组合型的数据结构,它称为结构体。 1.结构体类型形式: struct 结构体名 { 类型名 成员名; }; 2.结构体中可以使用的类型: (1)基本数据类型 (2)前面已经定义好的结构体 (3)结构体本身的指针//以下是举例,不是具有功能的完整代码#include#includestruct Student //st

2017-05-07 00:13:42 249

原创 C语言基础知识之一

基础知识 1.1字节=8位,1K=1024字节,1M=1024K,1G=1024M 一个字节共有8个位,256(2^8)中状态 HEX hex 十六进制 DEC decimal 八进制 OCI octal 十进制 BIN binary 二进制 2.char的范围:-1

2017-05-04 23:21:31 1161

原创 C语言基础知识之三

时间复杂度与空间复杂度1.时间复杂度 T(n)=O(f(n)) 只保留最高项、不要系数(1){++x;s=0;} O(f(n))=O(1) (2)for 1层循环 O(f(n))=O(n) (3)for 2层循环,O(f(n))=O(n^2) (4)for 3层循环,O(f(n))=O(n^3) (5)for(int i=2;i<=n;i++) for(int

2017-05-04 20:55:11 246

原创 C语言基础知识之四

*一、内存的动态分配1.malloc 原型:void * malloc(unsigned int size); 注:形参size的类型定为无符号整型(不允许为负数),此函数返回的指针指向该分配域的开头位置。 若内存空间不足,则返回空指针NULL 例:int * arr=(int *)malloc(n * sizeof(int)); 2.calloc 原型:void

2017-05-03 10:08:52 212

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除