c/c++
Tobiu
才能不是来自于别人,而是自己的勤奋,不断学习,不断锻炼,不断总结积累。
展开
-
小行星碰撞(c++ 栈的应用)
题目:输入一个表示小行星的数组,数组中每个数字的绝对值表示小行星的大小,数字的正负号表示小行星运动的方向,正号表示向右飞行,负号表示向左飞行。如果2颗小行星相撞,那么体积小的小行星将会爆炸最终消失,体积大的小行星不受影响。如果相撞的两颗小行星大小相等,那么它们会爆炸消失。飞行方向相同的小行星永远不会相撞。求最终剩下的小行星。例如,有6颗小行星[4,5,-6,4,8,-5],它们相撞之后最终剩下3颗小行星[-6,4,8]。#include <vector>#include <原创 2021-10-11 20:25:09 · 544 阅读 · 0 评论 -
c++之友元
1.为什么要引用友元提高程序运行效率,既减少了类型和安全性检查及调用时间的开销,但它破坏了类的封装型和隐藏性,使得非成员函数可以访问类的私有成员。2.使用场景1)运算符重载的某些场合;2)2个类要共享数据3)异类若想要访问private的数据,必须声明为友元3.使用友元函数友元函数是在类中使用关键字friend修饰的非成员函数。由于友元函数不是成员函数,所以不存在this指针,必须通过对象来访问。友元仅是打破了外部访问中的private的权限。A声明为B的友元,A就原创 2021-08-19 15:57:01 · 479 阅读 · 0 评论 -
程序预处理阶段,在做什么
C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。预处理指令包括条件编译、源文件包含、宏替换、行控制、抛错、杂注和空指令。1.条件编译条件编译的功能是根据条件有选择性的保留或者放弃源文件中的内容。常见的条件包含#if、#ifdef、#ifndef指令开始,以#endif结束。用#undef 指令可对用#define定义的标识符取消定义。#if defined(CREDIT) credit();#elif defi原创 2020-08-22 11:22:56 · 1210 阅读 · 0 评论 -
c++中static关键字浅析
1.静态全局变量与全局变量在全局变量前加static关键字,即为静态全局变量 静态全局变量在程序的全局数据区分配内存, 若未初始化则默认初始化为0,直到程序结束才销毁 静态全局变量在该文件内可见,从变量定义处开始直到文件结束(普通全局变量在同一个程序的其它文件中可见,默认是external属性,而静态全局变量是internal属性,而在其它文件中不可见,对位隐藏)全局变量的使用在.cpp里定义变量。在头文件里extern该变量。其它文件只要引用了该头文件就能使用该变量。2.静态局部原创 2020-08-20 16:02:40 · 157 阅读 · 0 评论 -
gdb调试工具参数说明
Name gdb - The GNU Debugger概要gdb [-help] [-nh] [-nx] [-q] [-batch] [-cd=dir] [-f] [-b bps] [-tty=dev] [-s symfile] [-e prog] [-se prog] [-c core] [-p procID] [-x cmds] [-d dir] [prog|prog procID|prog core]描述 ...原创 2020-08-13 10:51:10 · 916 阅读 · 0 评论 -
TCP的TIME_WAIT状态分析
1.TCP状态CLOSED:无连接是活动的或正在进行LISTEN:服务器在等待进入呼叫SYN_RECV:一个连接请求已经到达,等待确认SYN_SENT:应用已经开始,打开一个连接ESTABLISHED:正常数据传输状态FIN_WAIT1:应用说它已经完成FIN_WAIT2:另一边已同意释放ITMED_WAIT:等待所有分组死掉CLOSING:两边同时尝试关闭TIME_WAIT:另一边已初始化一个释放LAST_ACK:等待最后一个ACK信号,就关闭2.发生的场景在四次挥手的过原创 2020-08-06 19:35:42 · 663 阅读 · 0 评论 -
c++库的制作和调用
环境: window10, vs2015, c++一.创建静态库1.创建一个简单的静态库2.随手来几个print,再弄个头文件。3.注意生成的平台配置,只能给对应的平台调用4.编译完成后,把lib和.h一拉出来,库就完成啦。就这么soeasy。二.调用1.在项目属性添加依赖项和库路径2.调用,头文件一包,就可以使用api了。三.动态库上面说了静态库,那动态库呢?其实道理一样,只是创建库项目的时...原创 2020-05-13 15:26:29 · 885 阅读 · 0 评论 -
线程同步之互斥量
1.互斥量采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享。2.使用HANDLE hMutex; //定义互斥对象句柄hMutex = CreateMutex(NULL, false, "mutex"); /...原创 2020-04-16 14:26:27 · 171 阅读 · 0 评论 -
线程同步之信号量
1.信号量信号量是维护0到指定最大值之间的同步对象。信号量状态在其计数大于0时是有信号的,而其计数是0时是无信号的。信号量对象在控制上可以支持有限数量共享资源的访问。信号量的特点和用途可用下列几句话定义:(1)如果当前资源的数量大于0,则信号量有效;(2)如果当前资源数量是0,则信号量无效;(3)系统决不允许当前资源的数量为负值;(4)当前资源数量决不能大于最大资源数量2...转载 2020-04-16 14:23:03 · 268 阅读 · 0 评论 -
线程同步之事件(Event)
1.事件事件(Event)是WIN32提供的最灵活的线程间同步方式,事件可以处于激发状态(signaled or true)或未激发状态(unsignal or false)。根据状态变迁方式的不同,事件可分为两类:(1)手动设置:这种对象只可能用程序手动设置,在需要该事件或者事件发生时,采用SetEvent及ResetEvent来进行设置。(2)自动恢复:一旦事件发生并被处理后,自动恢复...转载 2020-04-16 14:03:35 · 2176 阅读 · 0 评论 -
线程同步之临界区
1.临界区临界区(Critical Section)是一段独占对某些共享资源访问的代码,在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。临界区在使用时以CRITICAL_SECTION结...原创 2020-04-16 13:38:24 · 1196 阅读 · 0 评论 -
C语言日志库---zlog安装和使用
0. What is zlog?-------------zlog is a reliable, high-performance, thread safe, flexible, clear-model, pure C logging library. Actually, in the C world there was NO good logging library for app...原创 2020-03-02 17:30:57 · 910 阅读 · 0 评论 -
protobuff的安装和使用
0.环境 window10,C++1.准备1.1 下载protobuff:https://github.com/protocolbuffers/protobuf/releases,我下载的是3.101.2安装cmake:https://cmake.org/download/1.3cmake我下载的是目前最新的3.16,编译生成的protobuff,发现加进...原创 2019-10-17 14:46:54 · 2808 阅读 · 0 评论 -
编译工具的说明
编译工具包含以下工具:1.xxx-xxx-gcc:C/C++的编译器;2.xxx-xxx-nm:查看目标文件,可执行文件的符号列表和调试信息;3.xxx-xxx-ld:链接器;4.xxx-xxx-readelf:查看elf文件的信息5.xxx-xxx-objcopy:文件格式的转换,elf->二进制文件6.xxx-xxx-strip:删除目标文件或者可执行文件的符号列表和调试信息。7.xxx...原创 2018-07-04 23:33:17 · 4097 阅读 · 0 评论 -
[Al]算法:有n级阶梯,每次走1步或2步,最多有多少种走法
/****************************************************************** @Filename : floor.c* @Author : Mr.Zhong* @Date : 2018-11-02* @Description: n级阶梯,每次走一步或2步,最多有多少种走...原创 2018-11-02 23:30:52 · 6595 阅读 · 0 评论 -
[thinking]C语言flaot值比较
最近面试,发现很多基础的原理都还没搞懂。自己平时没有应用或接触到的知识,也不会想着去学习。但遇到的更多,自己就会去探索的更多。1.int型比较a == b;//( != ,<,>,<=,>=)2.bool型比较a == true;//false3.指针比较a. if(a == NULL);b. if(a != NULL);c. str或me...原创 2018-10-20 11:42:58 · 3810 阅读 · 1 评论 -
[thinking] malloc引发的事件
环境:ubuntu 16,C语言问题描述:程序中,malloc分配小于128字节可以正常分配,但大于128k的时候,malloc就崩了。分析:代码截图如下:下面是执行的结果,可以看出第710行是没跑的,死在了malloc里面。经过一段时间的思考和调试,通过man查找到了malloc的用法,仔细阅读才发现问题所在,man的说明如下,有兴趣的可以自己查看man手册:其中...原创 2018-09-29 15:06:26 · 4943 阅读 · 0 评论 -
Linux C编译原理
一.基本概念1.编译程序:把一种语言(源语言---高级语言)转换成另一种语言(目标语言---低级语言--> 汇编或机器语言)。2.词法分析:对输入的字符串进行扫描和分解,识别出一个个字符及其数据类型;3.语法分析:对输入的字符串进行语法单位的识别,判断是一个赋值语句还是其它表达式。4.语义分析与中间代码的产生:对输入的出现字符串进行语法的检查,合法会进行初步的翻译。(输入的是...原创 2018-09-28 22:11:17 · 5793 阅读 · 2 评论 -
C语言:数组
1.一维数组1.1 一维数组的定义 类型说明符 数组名[常量表达式];// int a[10]; 注:常量表达式中可以包括常量和符号常量,也就是说,C语言不允许对数组的大小做动态的定义,即数组的大小不依赖于程序运行过程中变量的值; 如下是不允许的:int n;scanf("%d",&n);int a[n];/* 在程序中临时输入数组的大小 ...原创 2018-08-21 22:20:13 · 1872 阅读 · 0 评论 -
C语言:switch多分支语句
switch语句是多分支语句,用来实现如下表示的多分支选择结构:switch(表达式){ case 常量表达式1: 语句1; break; case 常量表达式1: 语句1; break; case ...: ....; default: brea...原创 2018-08-20 23:51:43 · 11379 阅读 · 1 评论 -
[智能家居]限制程序可执行时间范围
项目需求:限制一个情景的执行时间段,如:一个情景只能在2点到3点执行,其它时间不执行。思路:获取当前的时间戳,把开始和结束时间设为今天的时间戳,拿当前时间与开始和结束时间三者做对比。当然也要考虑跨天的问题。涉及的知识点:1.tm结构体struct tm { int tm_sec; /* Seconds (0-60) */ ...原创 2018-12-01 10:04:23 · 4991 阅读 · 0 评论 -
[智能家居]Linux 字符编码的转换
1.项目需求:GB2312转UTF编码2.思路:iconv库的使用3.代码实例/************************************************* @FileName : gb2utf.c* @Description : Code convert* @Editor : Donkey* @Date ...原创 2018-12-01 15:16:00 · 6155 阅读 · 0 评论 -
栈(Stack)
最近在【极客时间】学习《数据结构和算法》,目的性的梳理以及记录下知识点。1.理解栈“后进先出,先进后出”,这就是典型的“栈”结构。比如:叠盘子,都是从下往上一个个放;取的时候,我们是从上往下一个个的依次取出来,不能随机抽出,只能按照规则。从栈的操作特性来看,是一种“操作受限”的线性表。只允许在一端插入和删除数据,基本操作是push(入栈)和pop(出栈),前者是插入元素到栈顶,后者是将...原创 2019-01-11 14:39:19 · 196 阅读 · 0 评论 -
数组的下标为什么从0开始
数组(Arrary)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。从数组存储的内存模型上来看,“下标”最确切的定义应该是“偏移(offset)”。如果用a来表示数组的首地址,a[0]就是偏移为0的位置,也就是首地址,a[k]就表示偏移k个type_size的位置,所以计算a[k]的内存地址只需要用公式:a[k]_address = base_address ...原创 2019-01-12 14:11:34 · 3490 阅读 · 0 评论 -
数据结构之单链表
Platform:ubuntu , C Language在一个项目中,数据结构使用的类型不会很多,并且结构一旦稳定,基本都很少对其改动。所以对于我个人而言,数据结构很少用到,但又及其重要。当前的项目使用的是队列,但究其根本,也只不过是操作受限的链表。从简单的单链表开始,做一知识点的整理。如有不足,还请指教!链表(Linked list) 链表是通过指针将一组零散的内存...原创 2019-02-13 14:09:22 · 335 阅读 · 0 评论 -
free()到底做了什么
1.问题在LeetCode上做题偶然发现一道题:free内存后,还继续调用该指针,于是好奇,想了解free到底做了什么。这段代码的free()掉了nextTemp结点的malloc内存,但后面还可以使用nextTemp = nextTemp->next。2.原因2.1 free的实现原理操作系统在调用malloc函数时,会默认在malloc分配的物理内存前面分配一个数...原创 2019-02-14 10:16:17 · 6481 阅读 · 2 评论 -
Linux C 实现atoi函数
目的:编写一个字符串转整型的接口/*************************************** Description : 实现atoi函数的作用* Editor : Donkey* Date : 2019-5-4 23:01**************************************/#include &...原创 2019-05-04 23:09:24 · 708 阅读 · 0 评论 -
获取tcp缓冲区大小 - C++
#include "stdafx.h"#include <WinSock2.h>#include <iostream>#pragma comment(lib,"ws2_32.lib")int main(){ WORD vVersionRequested; WSADATA wsaData; vVersionRequested = MAKEWORD(1, ...原创 2019-09-06 14:33:17 · 1857 阅读 · 0 评论 -
gdb调试
1 简介2 生成调试信息3 启动GDB 的方法4 程序运行上下文 4.1 程序运行参数 4.2 工作目录 4.3 程序的输入输出5 设置断点 5.1 简单断点 5.2 多文件设置断点 5.3 查询所有断点6 观察点7 条件断点8 维护停止点9 为停止点转载 2017-08-30 23:23:47 · 203 阅读 · 0 评论 -
c语言获取文件第n行数据
运行环境:ubuntu 64bit#include <stdio.h>#include <string.h>#include <stdlib.h>int main(int argc, char const *argv[]){ /* code */ FILE *fin; char buf[1024]; int x,y; int i; fin...原创 2018-06-30 17:31:59 · 9666 阅读 · 1 评论 -
获取本地ip,mac地址---Linux C
/*------------------------------------------------------------------- Filename : getLocalIP.c- CreateTime : 2018-05-28 17:15- Author : tobiu- Description : get ...原创 2018-05-28 17:25:27 · 1097 阅读 · 0 评论 -
未初始化和非法的指针
下面这个代码段说明了一个极为常见的错误:int *a;...*a = 12 ;这个声明创建一个名叫a的指针常量,后面那条赋值把12存储在a所指向的内存位置。警告:但是究竟a指向哪里呢?我们声明了这个变量,但从未对它进行初始化,所以我们没有办法预测12这个值将存储在什么地方。从这一点看,指针变量和其它变量并无区别。如果变量是静态的,它还被初始化为0;但如果变量是自动的,它根本原创 2017-12-03 23:44:10 · 316 阅读 · 0 评论 -
define与typedef
typedef,它允许你为各种数据类型定义新的名字。#define无法正确地处理指针类型,例如:#define pchar char *pchar a,b;正确的声明了a,但是b却被声明为一个字符。在定义更为复杂的类型名字时,如函数指针或指向数组的指针,使用typedef更为合适。原创 2017-12-03 19:13:29 · 150 阅读 · 0 评论 -
判断内存存储方式是大端还是小端的代码
原创 2017-12-02 15:45:46 · 497 阅读 · 0 评论 -
sizeof 和 strlen 区别
sizeof 和 strlen 区别-----------------------------------------------------------------------------------1.sizeof sizeof(...)是运算符,而不是一个函数。 一个简单的例子: int a; printf("--- sizeof(a) = %转载 2017-09-12 15:41:02 · 167 阅读 · 0 评论 -
0,\0,NULL之间的区别
1.0 is an integer constant2.'\0' is a character constant3.NULL is a macro(宏) defined in several standard headers(标准头文件)4.nul is the name of the character constant. (这个貌似一般很少见把。。反正我没见过 = = )All转载 2017-09-12 15:38:39 · 539 阅读 · 0 评论 -
ASCII码表
原创 2017-09-27 23:37:46 · 523 阅读 · 0 评论 -
struct stat结构体:获取指定路径的文件或者文件夹的信息
_stat函数用来获取指定路径的文件或者文件夹的信息。struct stat这个结构体是用来描述一个linux系统文件系统中的文件属性的结构。//需要包含的头文件 #include #include int stat( const char *filename //文件或者文件夹的路径 , struct stat *buf //获取的信息保存在内存中);原创 2017-09-06 10:41:11 · 1646 阅读 · 0 评论 -
有关指针变量的类型及含有义
变量定义类型表示含义int i;int定义整型变量iint * p;int *定义p 为指向整型数据的指针变量int a[5];int [5]定义整型数组a,它有 5个元素int * p[4];int * [4]定义指针数组p,它由 4个指向整型数原创 2017-09-05 14:44:31 · 527 阅读 · 0 评论 -
标准IO与文件IO 的区别
在谈两者区别之前,先来了解下什么是标准IO以及文件IO。1 定义标准IO: 标准I/O是ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头中的定义,具有一定的可移植性。标准IO库处理很多细节。例如缓存分配,以优化长度执行IO等。标准的IO提供了三种类型的缓存。 (1)全缓存:当填满标准IO缓存后才进行实际的IO操作。 (2)行缓存:当输入或输出中遇到新行符时,标准IO...转载 2017-09-05 14:15:02 · 9101 阅读 · 0 评论