c/c++
hello&Code
贵有恒何必三更起五更睡;最无益,只怕一日曝十日寒
展开
-
2020-11-23
一 原理1. IP合法关于IP地址的合法性验证很简单,方法也很多,比如字符串分解、正则表达式等。2. 子网掩码是否合法简单来讲,子网掩码就类似这样一串数字,前面一段是连续的1, 类似“111111111“,后面一段是连续的0,类似“00000”,这样合法的样子是“11111111000000000”,总共是32位。一个合法的子网掩码要满足如下条件: 1、是合法的IP地址 2、二进制码要相邻,即形如111...11000...0的形式 3、与IP地址对应...转载 2020-11-23 16:29:11 · 693 阅读 · 0 评论 -
linux设置代理
msys2设置网络代理在文件 .bashrc 中添加export http_proxy="proxy IP:port"如export http_proxy="192.168.0.1:8080"export https_proxy="192.168.0.1:8080"一,场景:有些linux服务器处于内网,并且没有公网ip,故要想与外网进行http/https通信只能通过nat或者加proxy的方式。nat服务器有网段的限制,而http/https proxy代理则没有,使用.转载 2020-08-21 14:56:47 · 2172 阅读 · 0 评论 -
readv()和writev()函数
read()和write()系统调用每次在文件和进程的地址空间之间传送一块连续的数据。但是,应用有时也需要将分散在内存多处地方的数据连续写到文件中,或者反之。在这种情况下,如果要从文件中读一片连续的数据至进程的不同区域,使用read()则要么一次将它们读至一个较大的缓冲区中,然后将它们分成若干部分复制到不同的区域,要么调用read()若干次分批将它们读至不同区域。同样,如果想将程序中不同区域的数据块连续地写至文件,也必须进行类似的处理。UNIX提供了另外两个函数—readv()和writev(),它们只转载 2020-08-18 16:23:34 · 2335 阅读 · 0 评论 -
状态模式、有限状态机 & Unity版本实现
游戏开发过程中,各种游戏状态的切换无处不在。但很多时候,简单粗暴的if else加标志位的方式并不能很地道地解决状态复杂变换的问题,这时,就可以运用到状态模式以及状态机来高效地完成任务。状态模式与状态机,因为他们关联紧密,常常放在一起讨论和运用。而本文将对他们在游戏开发中的使用,进行一些探讨。PS:这篇文章起源于《Game Programming Patterns》第二章第六节。这是一篇略长的文章,约5200余字,将分析游戏开发过程中状态模式与有限状态机的运用,已经非常了解相关内容的高端选手.转载 2020-07-07 11:27:06 · 237 阅读 · 0 评论 -
Linux系统内存知识
Linux 内存是后台开发人员,需要深入了解的计算机资源。合理的使用内存,有助于提升机器的性能和稳定性。本文主要介绍Linux 内存组织结构和页面布局,内存碎片产生原因和优化算法,Linux 内核几种内存管理的方法,内存使用场景以及内存使用的那些坑。从内存的原理和结构,到内存的算法优化,再到使用场景,去探寻内存管理的机制和奥秘。一、走进Linux 内存1、内存是什么?1)内存又称主存,是 CPU 能直接寻址的存储空间,由半导体器件制成2)内存的特点是存取速率快2、内存的作用.转载 2020-07-03 13:53:07 · 305 阅读 · 0 评论 -
getrlimit和setrlimit 两个函数详解
功能描述:获取或设定资源使用限制。每种资源都有相关的软硬限制,软限制是内核强加给相应资源的限制值,硬限制是软限制的最大值。非授权调用进程只可以将其软限制指定为0~硬限制范围中的某个值,同时能不可逆转地降低其硬限制。授权进程可以任意改变其软硬限制。RLIM_INFINITY的值表示不对资源限制。用法:#include <sys/resource.h>int getrlimit(int resource, struct rlimit *rlim);int setrlimit(in转载 2020-06-30 14:17:23 · 611 阅读 · 0 评论 -
浅谈linux的命令行解析参数之getopt_long函数
前言在linux中,经常需要各种命令,通常情况下都会带各种参数,而这些参数是如何解析的呢?通常使用GNU C提供的函数getopt、getopt_long、getopt_long_only函数来解析命令行参数。一、关于命令行参数命令行参数可以分为两类,一类是短选项,一类是长选项,短选项在参数前加一杠"-",长选项在参数前连续加两杠"--",如下表(ls 命令参数)所示,其中-a,-A,-b都表示短选项,--all,--almost-all, --author都表示长选项。...转载 2020-06-30 09:57:10 · 186 阅读 · 0 评论 -
变参详解
可变参数函数又称参数个数可变函数(本文也简称变参函数),即函数参数数目可变。原型声明格式为: type VarArgFunc(type FixedArg1, type FixedArg2, …); 其中,参数可分为两部分:数目确定的固定参数和数目可变的可选参数。函数至少需要一个固定参数,其声明与普通函数参数相同;可选参数由于数目不定(0个或以上),声明时用"…"...转载 2020-03-25 15:52:51 · 936 阅读 · 0 评论 -
inet_ntop()、inet_pton()、inet_addr()、inet_ntoa()函数之间的关系
- emmmmm,先看这张图来理解,知道这些函数的作用1. inet_pton()源码int inet_pton(int family, const char *strptr, void *addrptr){ if (family == AF_INET) { struct in_addr in_val; if (inet_aton(strptr,...转载 2020-03-13 16:20:47 · 522 阅读 · 0 评论 -
realloc用法
realloc函数并不初始化内存,如果要初始化内存里面的内容,可以用memset函数realloc原型:extern void *realloc(void *mem_address, unsigned int newsize);用法:#include <stdlib.h> 有些编译器需要#include <alloc.h>功能:改变mem_address所指内存区...转载 2020-03-03 16:25:01 · 2559 阅读 · 0 评论 -
链表创建
1.经常要用链表,所以找了个模板。----#include<stdio.h>#include<malloc.h>#include<stdlib.h>typedef int ElementType; // 定义数据类型,可根据需要进行其他类型定义 // 链表节点...转载 2020-02-21 08:55:19 · 543 阅读 · 0 评论 -
深入理解软件包的配置、编译与安装
前言从源代码安装过软件的朋友一定对 ./configure && make && make install 安装三步曲非常熟悉了。然而究竟这个过程中的每一步幕后都发生了些什么呢?本文将带领你一探究竟。深入理解这个过程将有助于你在LFS的基础上玩出自己的花样来。不过需要说明的是本文对 Makefile 和 make 的讲解是相当近视和粗浅的,但是对于理解安装过程来...转载 2020-01-15 14:24:53 · 407 阅读 · 0 评论 -
结构体内存分布以及指向下一内存
想指向结构体下一块内存,当结构体刚好满足4字节对齐,用struct match{ int a; char b[3]; unsigned char data;} node; 刚好满足4字节对齐用node->a+sizeof(struct match)、&(node->data)+1是可以指向下一块内存的struct match{int ...原创 2019-11-08 09:21:08 · 236 阅读 · 0 评论 -
undefined reference to symbol xxxxx和undefined symbol:xxxx错误的原因分析以及解决方法
Linux下编译程序时,经常会遇到“undefined reference to XXX” 报错,或者运行时出现undefined symbol:xxxx报错。这里总结一些可能的原因和解决方案,给需要的朋友:说到这两个错误,必须先提一下Linux gcc链接规则:编译源代码时,链接的时候查找顺序是:(1) -L 指定的路径, 从左到右依次查找(2) 由环境变量 LIBRARY_PATH...转载 2019-11-01 16:29:09 · 10477 阅读 · 0 评论 -
C语言在一个文件里调用另一个源文件中的函数
问题如题:C怎么在一个文件里调用另一个源文件中的函数解决办法程序大了之后,主函数看起来会十分繁杂,因此开始考虑模块化开发,C程序模块化开发只要写三种文件,1.func.h 2.func.c 3.main.c,作用分别如下:func.h 声明需要用到的头文件,自写函数等func .c 自写函数的具体实现,注意需要在其开头加上#include “func.h”main.c 主函数只需要在...转载 2019-10-30 16:26:54 · 10452 阅读 · 2 评论 -
GDB查看指定内存地址处的内容
命令格式:x/nfu <addr>如:(gdb)x/1xb0x7fffffffd708x : examine 的缩写n : 表示要显示的内存单元个数f : 表示显示方式, 可取如下值x 按十六进制格式显示变量。d 按十进制格式显示变量。u 按十进制格式显示无符号整型。o 按八进制格式显示变量。t 按二进制格式显示变量。a 按十六进制格式显示变...转载 2019-10-29 14:24:17 · 2800 阅读 · 0 评论 -
c编译时的错误:程序中有游离的‘\240’‘\302’‘\XXX 时解决方案
偶尔从网上看到不错的源码,想研究下,不幸编译时遇到“错误:程序中有游离的‘\240’‘\302’”之类的错误,大量的源码不可能再全部重敲一遍,经过一番研究,终于让我找到简单的解决方案,还是本着让后人少走弯路的想法,分享下:首先,编译器提示的\xxx,都是8进制的编码,使用sed做下全文替换,命令如下:sed -i 's/\o240\|\o302//g' filename.cpp\o指定...转载 2019-10-16 16:14:53 · 627 阅读 · 0 评论 -
C语言中,数字后面带个U,L,F的含义
U表示该常数用无符号整型方式存储,相当于unsigned intL表示该常数用长整型方式存储,相当于longF表示该常数用浮点方式存储,相当于float一、用于说明数据类型数值后面加“L”和“l”(小写的l)的意义是该数值是long型。 详细说如下: 5L的数据类型为long int。 5.12L的数据类型为long double。 数值后面加“U”和“u”的意...转载 2019-10-14 15:04:12 · 9931 阅读 · 0 评论 -
十六进制几种不同的输出格式
C语言基础——%X(十六进制)的几种不同输出格式2018年05月27日 01:36:17WangEason1985阅读数:17339/*time:2016.6.20function:aim:测试十六进制的不同输出方式,%x,%X,%#x,%#X;*/ #include <stdio.h> #include <stdlib.h&...转载 2019-04-30 13:39:06 · 1775 阅读 · 0 评论 -
do {...} while (0) 在宏定义中的作用及goto的用法
如果你是一名C程序员,你肯定很熟悉宏,它们非常强大,如果正确使用可以让你的工作事半功倍。然而,如果你在定义宏时很随意没有认真检查,那么它们可能使你发狂,浪费N多时间。在很多的C程序中,你可能会看到许多看起来不是那么直接的较特殊的宏定义。下面就是一个例子: 1 2 #define __set_task_state(tsk, state_value) ...转载 2019-08-20 19:28:21 · 794 阅读 · 0 评论 -
c语言动态与静态分配内存空间的区别
所谓动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。例如我们定义一个float型数组:float score[100]; 但是,在使用数组的时候,总有一个问题困扰着我们:数组应该有多大?在很多的情况下,你并不能确定要使用多大的数组...转载 2019-09-16 08:29:18 · 1396 阅读 · 0 评论 -
c++中cin输入一些注意事项
cin使用空格,制表符,和换行符,来确定字符串的结束的位置。cin将字符串放在数组中,并自动在结尾添加空字符串。cin在输入中不会读取我们自己按下的回车(\r\n),geline会图一:图二:图二中如果没有了cin.get(),那么第二次没有第二位捐款人的名字的输入。...原创 2018-05-04 15:28:44 · 3696 阅读 · 0 评论 -
引用及const常量
凡是常数值,只能在定义的时候赋值,进行初始化,定义过以后就不能更改常数的值了。1)引用仅是变量的别名,而不是实实在在地定义了一个变量,因此引用本身并不占用内存,而是和目标变量共同指向目标变量的内存地址. 2)表达式中的取地址符&不再是取变量的地址,而是用来表示该变量是引用类型的变量。 3)定义一个引用时,必须对其初始化。...转载 2018-10-30 23:12:53 · 227 阅读 · 0 评论 -
#define 换行需要加上\
#define rte_pktmbuf_mtod_offset(m, t, o) \ ((t)((char *)(m)->buf_addr + (m)->data_off + (o)))一行写不下了 表示换行 否则屏幕看起来费事转义字符进行连接原创 2019-04-26 17:23:13 · 2072 阅读 · 0 评论 -
链接库和头文件。
1.头文件系统标准头文件在: /usr/include 安装库的头文件位置:/usr/local/include/如有文件写成这样#include<linux/can.h>对应/usr/include/linux/can.h ,因为他在usr/include找不到头文件,是在usr/include/下目录下,所以必须指出他的完整路径。如果头文件就在usr/include下,就不...原创 2019-04-11 21:18:48 · 869 阅读 · 0 评论 -
C++中只能使用初始化列表(只能是初始化)不能使用赋值的情况
(1)当类中含有const(常量)、reference(引用)成员变量时,只能初始化,不能对它们进行赋值; 常量不能被赋值,只能被初始化,所以必须在初始化列表中完成,C++引用也一定要初始化,所以必须在初始化列表中完成。(2)基类的构造函数都需要初始化列表;(3)成员类型是没有默认构造函数的类;只有构造函数可以使用这种初始化列表语法---------------------...转载 2018-10-15 15:51:22 · 1529 阅读 · 0 评论 -
虚析构函数(派生类与基类)
1.情况1,class Base { public:~Base() { cout << "~Base()" << endl;}};class Derived1 : public Base { public: Derived1():name_(new string("NULL")) {} Derived1(const string&...转载 2018-10-15 21:27:51 · 1007 阅读 · 0 评论 -
c++三大特性(继承,封装,多态)及重载与多态的区别。
封装可以隐藏实现细节,使得代码模块化,继承可以扩展已存在的模块,它们目的都是为了:代码重用。而多态是为了实现另一个目的:接口重用。 封装是面向对象的特征之一,是对象和类概念的主要特性。封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。一旦定义了一个...转载 2018-10-22 10:34:20 · 3546 阅读 · 2 评论 -
C++ 类的静态成员及静态成员函数
https://www.cnblogs.com/codingmengmeng/p/5906282.html 因为静态成员函数属于整个类,在类实例化对象之前就已经分配空间了,而类的非静态成员必须在类实例化对象后才有内存空间,所以这个调用就会出错,就好比没有声明一个变量却提前使用它一样。 结论三:静态成员函数中不能引用非静态成员。不能通过类名来调用类的非静态成员函数,通过可以类名来调用...转载 2018-10-29 00:14:34 · 239 阅读 · 0 评论 -
枚举内存大小
枚举类型,指一个被命名的整型常数的集合。即枚举类型,本质上是一组常数的集合体,只是这些常数有各自的命名。枚举类型,是一种用户自定义数据类型。枚举变量,由枚举类型定义的变量。枚举变量的大小,即枚举类型所占内存的大小。由于枚举变量的赋值,一次只能存放枚举结构中的某个常数。所以枚举变量的大小,实质是常数所占内存空间的大小(常数为int类型,当前主流的编译器中一般是32位机器和64位机器中int型都是...转载 2018-10-29 23:20:02 · 1060 阅读 · 0 评论 -
c++抽象类
https://www.cnblogs.com/balingybj/p/4771916.html原创 2018-11-05 12:12:53 · 1844 阅读 · 0 评论 -
字符串和字符数值的区别(sizeof)
#include <stdio.h>#include<stdlib.h>#include<string.h>int main(){char x[]="abcdefg";char y[]={'a','b','c','d','e','f','g'};int xlen;int ylen;xlen=sizeof(x);ylen=sizeof(y);p...原创 2018-11-08 16:55:58 · 3567 阅读 · 0 评论 -
强制类型转换(int)、(int&)和(int*)的区别
(int)x 强制类型转换,是将浮点数x为参数构造整数(即float转换为int)(int &)y 则是告诉编译器将y看成int对待(内存里的数据不做任何转换),所以(int &)x值为1071 644 672。至于(int*)的话,我就不多说啦,就是强制转换成整型指针,一般人们容易混淆的是(int)和(int&)这两个。补充:浮点数0.0是比较特殊的,它并不按照...转载 2018-11-09 11:55:41 · 3766 阅读 · 0 评论 -
C++ 中sort 函数及 cmp 自定义规则的使用
C++ 中sort 函数及 cmp 自定义规则的使用需要头文件#include<algorithm>using namespace std; 这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址。也就是说,排序的区间是[a,b)。简单来说,有一个数组int a[100],要对从a[0]到a[99]的元素进行排序,只要写s...转载 2018-11-18 17:57:10 · 5947 阅读 · 3 评论 -
具有相同类型的指针类型变量p与数组a,不能进行的操作是:
A:p=a; B:*p=a[0]; C:p=&a[0]; D:p=&a; D不正确,因为&a,是指向数组的指针了, 链接:https://www.nowcoder.com/questionTerminal/772c1e2c77ef408d8b25e706bc2ab434?toCommentId=75662 来源:牛客网 ...原创 2018-09-20 11:33:35 · 11114 阅读 · 0 评论 -
结构体的大小及结构体之位域
结构体的大小:规则1:结构体的大小等于结构体内最大类型的整数倍规则2:结构体内的成员的首地址相当于结构体首地址的偏移量是其类型大小的整数倍规则3:为了满足规则1和2在结构体成员之后进行字节填充 结构体位域的大小规则:共用体:为了提速之类的,在结构体和联合体的内存块中,是按照一定的规则安排的联合体:联合体的内存不会为了所有成员安排,而是只取最大的成员的所需内存...原创 2018-09-02 17:07:57 · 2049 阅读 · 0 评论 -
typedef void (*Fun) (void) 的理解——函数指针——typedef函数指针
首先介绍大家比较熟悉的typedefint i;//定义一个整型变量itypedef int myInt;myInt j;//定义一个整型变量j上面介绍得是我们常用的比较简单的typedef的用法,下面首先介绍一下函数指针。函数指针的形式:形式1:返回类型(*函数名)(参数表) #include <iostream> using namespace st...转载 2019-01-24 20:23:42 · 289 阅读 · 0 评论 -
编译和链接
首先来说:预处理阶段:1.宏定义; 2.文件包含; 3.条件编译。 预处理命令以符号“#”开头。汇编:检查代码的规范性,是否有语法错误等,以确定代码实际要做的工作链接:主要是链接函数库这是主要是静态库和动态库,静态库指,编译链接时,将库文件加入可执行代码中,因此生成的文件比较大,但在运行的也就不再需要库文件。动态库与之相反,在编译链接时并没有将库文件的代码加入可执行文件中,而是在...原创 2018-12-27 16:07:59 · 121 阅读 · 0 评论 -
正确使用指针(指针作为输出型参数)与结构体指针作为函数参数
一个问题是,我们想用一个函数来对函数外的变量v进行操作,比如,我想在函数里稍微改变一下这个变量v的值,我们应该怎么做呢?又或者一个常见的例子,我想利用swap()函数交换两个变量a,b的值,我们应该怎么做呢(好吧,博主是觉得这个问题十分经典)。如果你真的理解【函数】这个工具的本质,我想你稍微仔细的思考一下,可能就不会来查看博主的这篇文章,对函数来说,它所传递的任何参数仅仅是原来参数的一个拷贝,...转载 2018-01-03 17:16:56 · 1803 阅读 · 0 评论 -
二维数组的首地址和第几行第0列的地址略解
在a[N][N]中a[i]表示的第i行第一列的地址 a+i表示的是第i行的首地址 a+i等同于&a[i](所以a+1就是行移动,a[i]+1就是列移动)原创 2018-03-07 20:28:37 · 3032 阅读 · 0 评论