自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

kikajack的博客

保险,互联网

  • 博客(477)
  • 收藏
  • 关注

原创 MySQL - 慢查询日志

开启慢查询日志通过 set 命令可以临时开启慢查询日志,MySQL 重启后修改丢失。如果想要永久开启,则需要修改配置文件,Linux 中是 /etc/my.conf 文件。临时开启慢查询日志mysql> set global slow_query_log = 1;Query OK, 0 rows affected (1.80 sec)mysql> show variable...

2019-09-22 13:05:50 177

原创 【Linux 应用编程】IO 多路转接 - select 和 poll

Linux 中,read 和 write 函数默认实现的是阻塞式的 IO。例如:while ((n = read(STDIN_FILENO, buf, BUFSIZ) > 0) { if (write(STDOUT_FILENO, buf, n) != n) { perror("write"); eixt(EXIT_FAILURE); }}如果需要同时从多个描述符读,则不...

2019-09-21 18:55:32 149

原创 MySQL - explain 输出信息详解

常用 SQL(假设表名是 student)连接查询、联合查询、子查询:查看表结构:show create student;desc student;增删索引:增加主键:alter table class add constraint primary key cid_pk(cid);删除主键:alter table class drop primary key;增加索引:alter ...

2019-09-20 19:59:26 359

原创 MySQL 连接查询、联合查询和子查询

准备测试数据create table class( cid int(10), cdesc varchar(20));create table student( sid int(10), name varchar(20), age int(3), cid int(10));create table teacher( tid int(10), name varchar(2...

2019-09-20 19:44:51 764

原创 【Linux 网络编程】多进程、多线程服务器并发模型

服务器在执行 accept 等待客户端连接时,会阻塞。客户端连接成功后 accept 函数返回,执行后面的代码。如果想要服务器同时为多个客户端服务,有以下几种方式:多进程:每来一个客户端,就开一个进程与其通讯。多线程:跟多进程类似,但每个客户端对应一个单独的线程IO多路复用:借助 select、poll 函数实现多进程服务器多进程模型中,为了避免产生僵尸进程,父进程必须回收子进程资...

2019-09-16 17:38:45 327

原创 【Linux 网络编程】socket 实现服务器和客户端

IP 地址可以标识网络中的主机,协议类型(TCP或UDP)加端口号可以表示主机上的进程。基本原理文件类型Linux 中有七种类型的文件,这些文件类型可以使用一些基本的函数,例如 read、write:普通文件目录链接文件字符设备块设备管道:pipe匿名管道,fifo有名管道套接字:socket套接字是全双工的,虽然只有一个文件描述符,但是在 Linux 内核中读写操作分别...

2019-09-16 11:46:12 1163

原创 C 语言中使用多字节字符,通过 UTF-8 支持中文

C 语言默认的 char 类型是单字节字符,仅支持 ASCII 码。但是 ISO C90 标准开始,定义了 wchar_t 类型用于支持多字节字符(头文件 wchar.h)。这一版标准中还定义了本地化和国际化相关的头文件 locale.h,可以通过其中的 setlocale 函数设置使用的字符集编码,一般用 UTF-8 足够了。每一种语言都分为内部编码(程序代码中使用的)和外部编码(例如打开的...

2019-09-01 15:26:49 10434

原创 【算法与数据结构】双端队列示例

双端队列可以从两侧入队和出队:#include <stdio.h>#include <stdlib.h>struct dequeNode { int data; struct dequeNode *next; struct dequeNode *prev;};typedef struct dequeNode Node;typedef Node * ...

2019-08-25 18:12:00 234

原创 【算法与数据结构】优先级队列 - 用二叉堆求数据流中的第K大的元素

数据流中的第K大的元素,总数据个数不足K个元素时返回-1。#include <stdio.h>#include <stdlib.h>typedef struct { int* data; int count; int capacity;} KthLargest;void heap_up(KthLargest* obj, int loc)...

2019-08-24 10:58:24 195

原创 【算法与数据结构】 用栈实现队列、用队列实现栈

用栈实现队列效果(需要两个栈)思路:栈1负责进数据,每次要实现出队效果的时候,借助栈2颠倒顺序后出栈即可。元素出队后可以有两种方式:把出队后栈2中的数据再依次放入栈1。效率低。出队后,栈2中的数据不需要动,此时仍然用栈1入栈,栈2出栈,只有在栈2空的时候,再把栈1中的所有数据搬入栈1。高效。#include <stdio.h>#include <stdlib.h&...

2019-08-20 22:31:47 373

原创 【算法与数据结构】链表逆序、相邻两元素逆序、探测环路

链表常见操作有:链表逆序链表每相邻两个元素逆序,例如 1, 2, 3, 4 => 2, 1, 4, 3探测是否构成环路#include <stdio.h>#include <stdlib.h>typedef struct NodeStruct { int data; struct NodeStruct *next;} Node, *...

2019-08-19 23:07:53 188

原创 【算法与数据结构】无重复字符的最长子串 -暴力破解和滑动窗口

滑动窗口创建两个指针 start 和 end,分别指向窗口起止位置。对于长度为 n 的字符串,总共需要循环 n 次。每次循环时,end 指针加一,同时保存当前字符的下一个位置,然后判断是否出现重复字符。如果无重复,则继续下次循环如果重复,则把 start 移到记录中对应字符的下一个位置#include <stdio.h>#include <string.h>...

2019-08-18 12:28:21 290

原创 HashTable 示例 - 找出数组中和为指定值的两个数

数组 [2, 4, 6, 8],和为 8,则返回 [0, 2]数组 [2, 3, 3],和为 6,则返回 [1, 2]#include <stdio.h>#include <stdlib.h>typedef unsigned int Index;typedef struct node { int data; struct node *next;...

2019-08-17 22:40:57 272

原创 【算法与数据结构】堆 heap - 基于数组实现的完全二叉树

#include <stdio.h>#include <string.h>#define MAXSIZE 100typedef struct heap { int data[MAXSIZE]; int size;} heap;void heap_init(heap *h) { h->size = 0; memset(h-...

2019-08-14 22:52:03 198

原创 Linux 进程间通信

Linux 进程间通信的方式可以分为三大类:管道信号IPC,又可分为三类共享内存消息队列信号量管道管道是 Linux 内核中的数据结构,类似于队列,管道中的特性如下:数据只能读取一次,读取后消失,不可再次读半双工通信,两端都可以用来写数据,但一端开始写数据的话,另一端只能用来读无数据时,读会阻塞;数据写满时,会写阻塞用过命令行的人,对管道应该不陌生。例如,查看...

2019-07-01 23:04:23 177

原创 Linux 中静态库、动态库的创建及使用

异同点静态库:文件名默认为 libXXX.a,就是可重定位目标文件的集合。编译时 gcc 会将静态库中的依赖打包到可执行文件动态库:文件名默认为 libXXX.so,执行时需要动态加载依赖创建并使用静态库创建静态库创建 sub.c 和 sub.h 两个文件,用于创建静态库:int sub(int x, int y) { return x - y;}#ifndef _SUB_...

2019-06-30 16:20:23 427

原创 gcc 和 gdb 常用选项

gcc编译步骤预处理,生成 .i 的文档[预处理器 cpp]:cpp test.c -o test.i编译,得到汇编代码 .s [编译器 cc1]:/usr/local/gcc-4.8.1/libexec/gcc/x86_64-unknown-linux-gnu/4.8.1/cc1 test.i汇编,得到目标代码(机器指令).o [汇编器 as]:as test.s -o test.o...

2019-06-19 13:31:14 1099

原创 C 语言二级指针的段错误

C语言中的指针变量C 语言中,指针变量也是变量,只不过跟 char、int 型等基本类型变量不同,指针变量中保存的是其他变量的地址和类型。通过这个地址,并根据类型来读取指定长度的字节,就可以把这个变量解析出来。int a = 3;int *p = &a; // & 是取地址符号,返回变量 a 的地址printf("%d\n", *p);C 语言中本身不支持字符串,但是...

2019-06-02 11:27:24 788

原创 C语义的预处理 - 宏定义中 # 和 ## 的意义及用法

宏定义基本语法C 语言中,所有预定义的宏,都会在预处理阶段进行替换。宏定义的语法为:#define 宏名 字符串简单宏定义下面的示例中,预处理后,所有出现 MAX 的位置都会被替换为 100:#include <stdio.h>#define MAX 100int main() { printf("MAX is: %d\n", MAX); return 0;}...

2019-05-25 13:12:03 377

原创 【算法与数据结构】动态规划

用递归求解问题时,反复的嵌套会浪费内存。而且更重要的一点是,之前计算的结果无法有效存储,下一次碰到同一个问题时还需要再计算一次。例如递归求解 Fibonacci 数列,假设求第 n 位(从 1 开始)的值,C 代码如下:#include <stdio.h>int fib(int n) { if (n < 3) { return 1; } return fib(n ...

2019-05-10 22:13:10 268

原创 【算法与数据结构】图的最小生成树 MST - Prim 算法

Prim 算法属于贪心算法。#include <stdio.h>#define VERTEXNUM 7#define INF 10000typedef struct Graph { int vertex[VERTEXNUM]; int edge[VERTEXNUM][VERTEXNUM];} Graph;void initGraph(Graph* G) { int...

2019-05-06 22:52:01 191

原创 【C语言工具】AddressSanitizer - 内存检测工具

Github 地址:https://github.com/google/sanitizersWiki 地址:https://github.com/google/sanitizers/wiki/AddressSanitizer参考:https://www.jianshu.com/p/3a2df9b7c353AddressSanitizer(地址杀菌剂,简称 ASan) 是谷歌出品的内存检查工具...

2019-05-04 13:56:16 1330

原创 【算法与数据结构】二叉堆和优先队列 Priority Queue

优先队列的特点普通队列遵守先进先出(FIFO)的规则,而优先队列虽然也叫队列,规则有所不同:最大优先队列:优先级最高的元素先出队最小优先队列:优先级最低的元素先出队优先队列可以用下面几种数据结构来实现:基于堆 heap,包括下面几种堆:二叉堆多项式堆Fibonacci 堆基于二叉搜索树 BST如果用线性数据结构来实现优先级队列,则时间复杂度均为 O(n)。而如果用...

2019-05-03 22:16:33 428

原创 【算法与数据结构】三种简单排序 - 冒泡排序、选择排序、插入排序

冒泡排序逐个比较相邻元素,如果逆序则交换。每一趟都会让一个元素就位,总共比较 n-1 趟。n 个元素,需要进行 n - 1 轮冒泡,每次冒泡都会有一个元素就位,所以每轮冒泡的循环次数都会减一。时间复杂度为:1 + 2 + … + n-1 = n(n-1)/2 = O(n^2)初始值: 5 4 3 2 1 首轮冒泡: 4 3 2 1 5 最后一个元素就位第二轮: 3 2 1 4 5...

2019-05-02 12:33:23 220

原创 【算法与数据结构】并查集 Disjoint Set

并查集(Disjoint Set)用来判断已有的数据是否构成环。在构造图的最小生成树(Minimum Spanning Tree)时,如果采用 Kruskal 算法,每次添加最短路径前,需要先用并查集来判断一下这个路径是否会构成环。思路遍历图的每一条边,按照下面的原则将对应的两个顶点添加到集合中:如果两个顶点都不属于任一集合,则创建新的集合,并将这两个顶点放入如果两个顶点都已经属于某个...

2019-04-30 13:25:04 472

原创 【算法与数据结构】二叉堆和堆排序

构建堆堆本身也是个二叉树,有两个限制:堆必须是完全二叉树堆中任一父结点的值大于其左右两子节点的值因为完全二叉树中,数据排列顺序是从上而下,从左至右,所以可以用数组的形式保存数据。通常根结点作为数组的 0 号元素,其左右孩子分别是 2 号、3 号元素,以此类推。保证一个元素符合要求保证一个元素符合要求的过程,可以叫做 heapify。其顺序是:如果元素超限,退出比较元素值及其左...

2019-04-29 13:30:29 356

原创 【Linux 应用编程】进程管理 - 进程间通信IPC之共享内存 mmap

IPC(InterProcess Communication,进程间通信)是进程中的重要概念。Linux 进程之间常用的通信方式有:文件:简单,低效,需要代码控制同步管道:使用简单,默认阻塞匿名管道 pipe:只存在于内核缓冲区,只能用于有血缘关系的进程有名管道 FIFO:在文件系统中存在,可用于无血缘关系的进程信号量:使用复杂,但开销小,操作系统本身支持信号量内存映射区 mm...

2019-04-14 13:37:15 189

原创 【Linux 应用编程】进程管理 - 进程间通信IPC之管道 pipe 和 FIFO

IPC(InterProcess Communication,进程间通信)是进程中的重要概念。Linux 进程之间常用的通信方式有:文件:简单,低效,需要代码控制同步管道:使用简单,默认阻塞匿名管道 pipe:只存在于内核缓冲区,只能用于有血缘关系的进程有名管道 FIFO:在文件系统中存在,可用于无血缘关系的进程信号量:使用复杂,但开销小,操作系统本身支持信号量内存映射区 mm...

2019-04-14 11:41:16 164

原创 【Linux 应用编程】进程管理 - 进程、线程和程序

基本概念程序和进程的区别程序是平台相关的二进制文件,只占用磁盘空间。编写完程序代码后,编译为可执行的二进制文件即可。进程是运行中的程序,占用 CPU、内存等系统资源。通过 Shell 命令,可以在终端启动进程,例如执行 ls 命令:找到命令对应的二进制文件使用 fork() 函数创建新的进程在新创建的进程中调用 exec 函数组,加载命令对应的二进制文件,并从 main 函数开始执...

2019-04-08 22:23:39 197

原创 【Linux 应用编程】基础知识

错误提示Linux 提供的系统调用API,通常会在失败的时候返回 -1。如果想获取更多更详细的报错信息,需要借助全局变量 errno 和 perror 函数:#include <stdio.h>void perror(const char *s);#include <errno.h>const char *sys_errlist[];int sys_nerr;...

2019-04-07 14:16:33 196

原创 【Linux 应用编程】文件IO操作 - 常用函数

Linux 系统中的各种输入输出,设计为“一切皆文件”。各种各样的IO统一用文件形式访问。文件类型及基本操作Linux 系统的大部分系统资源都以文件形式提供给用户读写。这些文件可以分为:普通文件:即一般意义上的磁盘文件;设备文件:系统中的具体设备;管道文件、FIFO 文件:用于进程间通信;套接字(socket)文件:用于网络通信方面。文件的通用操作为:打开、关闭、读、写、创建。对...

2019-04-06 22:37:03 674

原创 数据结构

基本数据结构集合:元素之间没有关系,各自独立线性结构:元素之间是一对一的关系,除首尾元素外每个元素都有一个前驱和一个后继树:元素之间是一对多的关系,每个父元素可以有多个子元素,但子元素只能有一个父元素图:元素之间是多对多的关系,每个元素都可以跟另外的一个或多个元素关联在上面这四种结构的基础上,再进行组合排列,就可以表示整个宇宙了。数据的存储结构任何类型的数据,最终都需要存储在内...

2019-01-31 18:41:09 128

原创 Linux 命令 - man 查看命令的文档

man 命令是 Linux 中最常用的命令,碰到任何让你疑惑的命令,都可以 man 一下来查看详情。不只是 shell 命令,C 语言库函数和系统调用等内容也可以通过 man 命令查看。man 命令默认查看的是 shell 命令的文档,可以指定参数 2 查看系统调用,3 查看 C 库函数(需要提前安装)。可以在 Linux 中直接输入 man man 查看 man 命令的帮助文档,最常用的就是查...

2019-01-27 13:46:02 2466

原创 C 语言的函数 - 内存分析

函数基本概念Linux 中,函数在内存的代码段(code 区),地址比较靠前。函数定义C 语言中,函数有三个要素:入参、返回值、函数名,缺一不可。函数使用前必须先声明,或者在使用之前定义。函数声明格式如下:int test(int a, char *p);函数定义格式如下:int test(int a, char *p){ // 干点啥 return 666;}函数调用...

2019-01-22 23:13:02 541 1

原创 程序的内存分布 - 以 Linux 为例,基于 C 语言分析

这里以 Linux 为例,用 C 语言进行演示。内存模型-内存空间名称内容读写操作分配时机高地址kernel 内核空间命令行参数、环境变量等不可读写程序运行时-stack 栈空间局部变量可读写程序运行时-heap 堆空间malloc() new() 内存分配函数创建可读写程序运行时-全局数据空间(初始化的和未初始化的)静态...

2019-01-21 23:38:53 366

原创 C 语言结构体 struct 及内存对齐

对于 32 位数据总线的机器,每次内存操作都固定传输 32 位数据,且都没有重叠时,效率是最高的。所以操作系统把内存按照数据总线的位数划分为独立单元,每个单元都完整的分配给一个程序。C 语言的 struct 结构体中,可以放各种类型、不同长度的数据,可以看做一个数据包。为了在程序内部提高内存访问效率,也需要对齐内存。内存对齐下面的示例,struct People 中的第一个变量 sex 会对...

2019-01-20 22:43:20 167

原创 C语言的指针和数组

指针和内存指针变量也是个变量,不过保存的是另一个变量的地址。另外编译器还会记住指针所指向变量的类型,从而在指针运算时根据变量类型采取不同操作。例如,char * a 定义了char 类型的指针变量 a,通过 *a 读取数据时,每次只会读一个字节(char 类型变量的长度)。而int * i 定义了 int 类型的指针变量 i,通过 *i 读取数据时,每次会读两个或四个字节(int 类型变量的长...

2019-01-20 22:15:05 278

原创 C 语言的运算符

算术运算C 语言支持 + - * / % 五种运算,加减乘除取模。所有 CPU 都内建加法器,可以完成加法操作。减法操作可以转为加法操作。大部分 CPU 都没有内置乘法器,此时编译器会把 * / 乘除运算转为加法运算,用软件来模拟乘法。逻辑运算逻辑运算的返回结果是 1 或 0,C 语言中没有布尔类型,真假即用 1 和 0 代替。|| 和 &amp;&amp;逻辑与 &amp;&amp;...

2019-01-19 22:04:03 243

原创 C 语言中的关键字 - 数据类型、数据修饰符及逻辑结构

C 语言中有 32 个关键字。这是留个编译器用的特殊字符串,用户不可以使用。特殊关键字sizeof 和 return 是 C 语言中的两个特殊关键字。sizeofsizeof 用于计算变量所占内存空间的字节数,返回值为 unsigned long 无符号长整型。sizeof 不依赖底层操作系统,可以在编译时直接得到。有两种用法:int a;printf("%lu\n", sizeof...

2019-01-19 20:17:55 840

原创 C 语言中的预处理

C 语言中以 # 开头的就是预处理指令,例如 #include 。预处理指令的用途所有的预处理指令都会在 GCC 编译过程的预处理步骤解析执行,替换为对应的内容。在下一步编译过程中,看不到任何预处理信息,只需要对独立的程序文件进行操作即可。预处理指令的类型包含类 #include 头文件通过 #include 引入的头文件,会在 GCC 编译过程中的预处理步骤进行展开,替换为完整的头文...

2019-01-19 15:30:18 209

空空如也

空空如也

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

TA关注的人

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