- 博客(70)
- 收藏
- 关注
原创 char*与char []的区别
char*与char[]的讨论来源于这么一段代码。#include <stdio.h>#include <string.h>int main(){ char str[] = "hello"; //char* ptr = "hello"; char* tmp = str; tmp+=strlen(str)-1; *tmp = 's'; printf("%c\n", *tmp); return 0;}如果把上面的
2020-11-17 21:04:12
348
原创 snprintf返回值陷阱封装
snprintf函数snprintf()函数用于将格式化的数据写入字符串,其原型为:int snprintf(char *str, int size, char * format [, argument, ...]);str为要写入的目标字符串;size为能写入的字符的最大数目,超过n会被截断,包括’\0’符,所以能最大写入的其实是size-1个字符;format为格式化字符串,使用方式与printf()函数相同;argument为变量,可为多个,取决于format,这里的使用方式与prin
2020-08-20 16:59:30
564
原创 哈希表之闭散列
闭散列(即开放地址法):当发生哈希冲突时,如果该哈希表还没有被填满,那么就把该元素放到哈希表的下一个空闲的位置。代码实现思路:哈希表结构的封装首先我们能够知道哈希表是否冲突。我们使用状态标记来查看哈希表是否冲突。那么就有三种状态:当前位置空着,当前位置存在元素,当前元素已经被删除(这个一会会在删除的时候讲到)接下来我们要对哈希表每一个存储位置空间去进行描述;哈希表每一个存储位置都有哪些元素:key、value、状态标记;最后哈希表的构造。整个哈希表是由一个个存储位置构成的,包括哈希表当前有效的
2020-08-02 21:35:22
312
原创 IP分片
IP报文分片与重组数据链路层中的每条数据链路的MTU都不一样,比如以太网的MTU为1500字节,而FDDI为4352字节等等。但是IP位于数据链路层的上一层,它必须不受限于不同数据链路的MTU大小。任何一台主机都有必要对IP分片进行相应的处理,分片往往在网络上遇到比较大的报文无法一下子发送出去才会被处理。用一个例子来进行说明,如下图我们使用两个数据链路来完成数据传输,左边我们使用FDDI的数据链路,其MTU为4352;右边我们使用以太网的数据链路,MTU为1500;由于以太网的MTU是1500字节,因此
2020-07-27 20:41:34
1569
原创 TCP/IP四层模型协议格式
1、以太网协议2、ARP协议以太网前两个字段目的地址和以太网源地址中,如果目的地址为全一则代表广播地址。帧类型:表示后面数据的类型。0x0806表示ARP请求与应答硬件类型:表示硬件地址的类型。为1表示以太网地址。协议类型:表示要映射的协议地址类型,0x0800表示IP地址,它的值与以太网数据帧中类型字段的值一样。硬件地址长度与协议地址长度:硬件地址和协议地址的长度。对于以太网IP地址的ARP请求/应答,值为6和4。op:操作字段。ARP请求:1,ARP应答:2;RARP请求:3,RAR
2020-07-26 19:58:29
446
原创 默认使用Adobe Acrobat DC打开设置
如果我们电脑上有Adobe Acrobat DC和WPS这两种打开pdf的工具,那么可能我们刚开始的时候是默认使用WPS打开的PDF,但是这个时候我们想要默认使用Adobe Acrobat DC打开PDF,那么我们应该怎么做呢?首先我们打开电脑上的设置然后点击上面的应用,接着点击按默认值设置应用然后找到Adobe Acrobat DC这个软件之后点击管理,进去之后找到有一个WPS的标志,点击换成上面的Adobe Acrobat DC,就设置完成了。...
2020-07-21 22:08:10
5791
原创 TCP/IP协议之ICMP协议
ICMP协议1、ICMP:被认为是IP层的组成部分,主要是用来传递差错报文以及其他需要注意的信息。2、ICMP协议的格式8位类型:类型字段有15个不同的值,以描述特定类型的ICMP报文。16位校验和:检验和字段覆盖整个ICMP报文,使用二进制反码求和来检验报文是否出错。typedef struct icmp_hdr{ unsigned char icmp_type; //消息类型 unsigned char icmp_code; //代码 unsigned short icmp_c
2020-06-03 20:02:17
801
原创 TCP/IP详解之IP协议
IP数据报的格式IP协议是TCP/IP协议族中最核心的协议。IP协议在网络中唯一标识一台主机,为数据报提供最好的传输服务。1、4位版本:以IPV4为例,协议的版本号为4;2、4位首部长度:IP头部的长度是多少个32bit,也就是length4的字节数;4bit表示的最大长度是15,所以IP头部最大长度是60个字节;3、8位服务类型:3位优先权字段(已经弃用),4 bit的TOS子字段和1 bit未用位但必须置0。4 bit的TOS分别代表:最小时延、最大吞吐量、最高可靠性和最小费用。这四者相互冲
2020-05-31 19:09:22
475
原创 Linux线程创建
线程创建创建线程需要用到pthread_create这个函数,需要注意的是这个函数不是系统提供的,而是一个库函数,所以用这个函数的时候要引入头文件<pthread.h>函数原型int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), voi...
2020-05-31 18:51:38
158
原创 Linux线程概念(经典必看)
线程的引入从20世纪60年代提出进程的概念之后,使得多个程序可以实现并发执行(单CPU中),改善了资源的利用效率,提高了系统的吞吐量。此时进程作为系统中的一个基本单位,具有两个属性:进程作为资源分配和拥有的基本单位进程是一个可以独立调度和执行的基本单位进程的这两个基本属性构成了进程并发执行的基础,但是在进程的推进过程中,系统必须进行一系列的操作,如创建进程、撤销进程、切换进程等。由于进...
2019-12-18 15:01:10
393
转载 线程的阻塞和挂起
挂起:一般是主动的,由系统或程序发出,甚至于辅存中去。(不释放CPU,可能释放内存,放在外存)阻塞:一般是被动的,在抢占资源中得不到资源,被动的挂起在内存,等待某种资源或信号量(即有了资源)将他唤醒。(释放CPU,不释放内存)另外,有一段话很形象: 首先这些术语都是对于线程来说的。对线程的控制就好比你控制了一个雇工为你干活。你对雇工的控制是通过编程来实现的。 挂起线程的意思就是你对主动对雇...
2019-12-18 10:11:00
712
原创 变态青蛙跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。int jumpFloorII(int number)这是一个典型的动态规划题,要做这一道题,首先要知道动态规划的思路动态规划问题一般从以下四个角度考虑:1、状态定义2、状态间的转移方程定义3、状态的初始化4、返回结果状态定义的要求:定义的状态一定要形成递推关系...
2019-12-09 10:57:48
120
原创 内存地址奇葩试题
二维数组X按行顺序存储,其中每个元素占1个存储单元。若X[4][4]的存储地址为Oxf8b82140,X[9][9]的存储地址为Oxf8b8221c,则X[7][7]的存储地址为?解题思路:由题中X[4][4]的存储地址为Oxf8b82140,可以知道第四行行首的地址为Oxf8b82140-4=Oxf8b8213c;由题中X[9][9]的存储地址为Oxf8b8221c,可以知道第九行行首的地...
2019-11-25 16:51:14
274
原创 内存对齐&&字节序试题小练
在一个64位的操作系统中定义如下的结构体:struct st_task{ uint16_t id; uint32_t value; uint64_t timestamp;};同时定义fool函数如下:void fool(){ st_task task = {}; uint64_t a = 0x00010001; memcpy(&task, &a, size...
2019-11-18 17:16:02
131
原创 数组中出现次数超过一半的数字
题目描述:时间限制:1秒 空间限制:32768K数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解题思路1:首先对这一个数组进行排序,如果这个数组中存在一个数字出现的次数超过...
2019-11-10 10:47:08
102
原创 字符串中找出连续最长的数字串
题目描述:读入一个字符串str,输出字符串str中的连续最长的数字串输入描述:1个测试输入包含1个测试用例,一个字符串str,长度不超过255。输出描述:在一行内输出str中里连续最长的数字串。示例1输入abcd12345ed125ss123456789输出123456789解题思路:遍历字符串,使用cur去记录连续的数字串,如果遇到不是数字字符,则表示一个连续的...
2019-11-09 17:00:52
145
原创 Linux下core文件的生成、使用和关闭
core文件的生成ulimit -a:检查生成core文件的选项是否打开那么怎么才能产生core文件呢?使用ulimit -c unlimited来设置无限大,则任意情况下都会产生core文件,不过使用这个命令必须要在root下使用接下来我们就写一段代码来演示一下core文件的使用这段代码显然是有问题的,我们运行程序看会发生什么情况?生成了一个core.69801的文件,这个...
2019-11-03 18:10:09
2558
原创 队列之C++实现
Queue.hpp#include<iostream>using namespace std;typedef struct QueueNode{ QueueNode() :next(nullptr) {} struct QueueNode* next; int data;}Node;class Queue{public: Queue() ...
2019-11-03 11:52:33
127
原创 顺序表和链表对比
1、底层结构上顺序表底层结构是一段连续的空间(也可以这么说顺序表底层空间是逻辑上和物理上都是连续的)链表底层结构是动态的创建不连续的空间(链表底层是逻辑上连续,物理上不连续)2、随机访问顺序表支持随机访问,访问某个元素效率为o(1)链表不支持随机访问,访问某个元素的效率为o(n)3、插入和删除效率顺序表的插入删除效率低,需要搬移元素,时间复杂度为o(n),并且再插入的时候还有可能需要...
2019-11-02 16:03:20
538
原创 栈之C++实现
Stack.hpp#include<iostream>using namespace std;class Stack{public: Stack(int* array,int size = 3) :_array(nullptr) ,_size(0) ,_capacity(size){ _array = new int[_capacity];...
2019-11-02 15:20:44
87
原创 链表之C++实现
Slist.hpp#include<iostream>using namespace std;typedef struct Node{ struct Node* next; int data;}Node;class Slist{public: Slist() :head(nullptr){} Node* BuySlistNode(const int ...
2019-11-01 18:07:30
128
原创 顺序表之C++实现
#include<iostream>using namespace std;template<class T>class SeqList{public: SeqList(T* array,int size) :_array(new T[size]) ,_capacity(size) ,_size(0) { for(int i=...
2019-10-30 12:06:41
92
原创 C/C++中const关键字的用法
一、C语言中const关键字的用法修饰变量一定要给变量初始化,否则编译会报错关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变修饰指针char s[] = “hello”char* p = s;const char* p = s; //p指向可变,指向内容不可变char* const p =s; //p指向不可变,指向内容可变co...
2019-10-09 13:59:35
186
原创 C/C++中static关键字的用法
C语言中static关键字的用法主要体现在三个方面:对全局变量、局部变量、函数1、全局变量static修饰全局变量,会改变全局变量的作用域;static修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以2、局部变量static修饰局部变量,会改变局部变量的生命周期;static修饰局部变量,这个局部变量就成了静态局部变量,会改变局...
2019-10-09 10:26:00
318
原创 图片服务器
项目背景如果大家能看到这篇文章,那么相信大家对csdn已经有了一定的了解;以我们写博客为例,我们可能都会在自己写的博客上上传图片,而这张图片最终就会展示在网页上,那么一张图片是怎么展示在网页上的呢...
2019-09-04 20:19:36
270
原创 信号
信号什么是信号?信号的概念是一个软件中断;通知进程发生了某件事情,中断进程当前操作,让进程去处理这件事情信号的种类操作系统中定义信号的种类:通过kill -l 查看信号种类;信号总共有62种信号有两大类型:可靠信号:1-31号信号非可靠信号:34-64号信号...
2019-08-18 12:28:09
101
原创 多态
前言:此篇博客中的代码及解释都是在vs2017下的x86程序中,涉及的指针都是4字节。如果要其他平台下,部分代码需要改动。例如:如果是x64程序,则需要考虑指针是8字节的问题多态的概念概念:同一事物在不同场景下表现出的不同状态举个例子:我们作为一个人在不同的场合可能拥有不同的身份:在学校我们是学生,我们跟老师说话的时候可能比较拘谨;在家里我们可能是儿子,弟弟等等,我们跟自己的父母,兄弟姐...
2019-08-06 10:49:12
117
原创 插入排序
插入排序基本思想:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个有序的序列那么插入排序是怎么借助上面的思想实现的呢?在实际生活中我们玩扑克牌的时候,就使用了插入排序的思想插入排序步骤的总结1、从第一个元素开始,该元素可以被认为已经排好序2、 取出下一个元素,依次与前面的元素比较。3、如果大于前面的元素,则继续往前...
2019-07-29 14:25:32
90
原创 详解C++中的继承
什么是继承?继承的概念通俗上来说就是儿子继承父亲,儿子继承父亲之后,儿子继承了父亲的一些特征(儿子跟父亲就有一些共同的特征),所以看起来儿子跟父亲就比较像。那么对于标准的定义来说是什么呢?继承机制是面向对象程序设计使代码可以复用 的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知...
2019-07-25 17:07:41
83
原创 String类的基本操作
String类是表示字符串的字符串类,该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作String的常规操作,String在底层实际是:basic_string模板类的别名typedef basic_string<char,char _traits,allocator>string ;不能操作多字节或者变长字符的序列。在使用string类时,必须包含#include头文件以...
2019-07-24 21:18:06
259
原创 类的六个默认成员函数
如果一个类中什么成员都没有,则就是空类。但是空类中什么都没有吗?其实并不是这样的,任何类在我们不写的情况下,都会自动生成下面六个默认成员函数。class Date{};初始化和清理构造函数构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,但是需要注意的是构造函数的主要任务并不是开空间创建对象,而是初始化对象。...
2019-07-17 17:48:51
175
原创 类成员函数的this指针
我们首先先定义一个学生类class student {public: void InitStudent(const char* name, const char* gender, int age) { strcpy(_name, name); strcpy(_gender, gender); _age = age; } void PrintStudent() { cout...
2019-06-19 14:34:33
1081
原创 环境变量
环境变量环境变量:存储系统运行环境参数的变量查看环境变量:env set echo常见的环境变量:HOME PWD SHELL PATHPATH:指定可执行程序的默认搜索路径设置环境变量:export删除环境变量:unset环境变量特性:全局特性(继承)shell终端下所运行的进程能够获取到所有的环境变量,但是获取不到普通变量环境变量在代码中的获取:ch...
2019-06-19 08:28:06
171
原创 进程间通信之管道
什么是进程间通信?进程间通信就是操作系统为用户所提供的进程间几种通信方式操作系统为什么要为用户提供进程间通信方式?因为进程的独立性(都操作的是自己虚拟地址空间中的虚拟地址,无法访问别人的地址),因此无法直接通信,因此需要操作系统给用户提供一些公共的媒介让多个进程都能通过访问这个媒介进行通信。但是也因为进程间的通信场景有多种,因此操作系统提供了多样的通信方式system V标准:管...
2019-06-18 11:09:03
171
原创 系统文件I/O接口的实现
系统文件I/O接口类比C语言文件接口实现,它们的操作流程基本是类似的。但是C文件中的接口fopen、fclose、fwrite、fseek、fread都是C标准库当中的函数,我们称之为库函数。而open、close、write、lseek、read是属于系统提供的接口,称之为系统调用接口。库函数跟系统调用接口是属于上下级的关系即库函数封装了系统调用接口。接下来就让我们认识一下系统调用接口。...
2019-06-13 13:27:51
191
原创 进程控制
进程创建forkfork有两个返回值父子进程代码共享,数据独有,私有一份(采用写实拷贝技术)新创建的子进程几乎但不完全与父进程相同。子进程得到与父进程用户级虚拟地址空间相同的(但是独立的)一份副本,包括代码和数据段、堆、共享库以及用户栈。子进程还获得与父进程任何打开文件描述符相同的副本,这就意味着当父进程调用fork时,子进程可以读写父进程中打开的任何文件。父进程和新创建的子进程之间...
2019-06-10 16:59:34
136
原创 简易minishell实现
要写一个shell,需要循环以下过程获取命令行解析命令行建立一个子进程替换子进程 1 #include<stdio.h> 2 #include...
2019-06-09 21:07:51
366
原创 二叉树链式结构的实现
对于二叉树链式结构的实现,理解二叉树的概念至关重要。在二叉树的创建以及求二叉树叶子节点的个数等其他操作时,都是先从二叉树的概念入手,一步一步完成二叉树的创建及其他操作,接下来看一下二叉树的概念二叉树的概念空树根节点+根节点的左子树+根节点的右子树接下来是二叉树的具体实现#pragma oncetypedef char DataType;typedef struct BNo...
2019-05-31 17:54:25
486
原创 树和二叉树的知识点总结
什么是树?树是一种非线性的结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。我们平常在生活中所看到的树是根在下,枝叶在上面。而对于数据结构中的树则是根朝上,枝叶朝下,正好与生活中的树的结构相反。树的特点每个结点有零个或多个子节点每一个非根结点有且只有一个父节点只有根节点没有父节点除了根结点外,每个子节点可以分为多个不相交的子树叶子节点点接下来我们从这个图来说...
2019-05-31 10:49:29
3339
5
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人