- 博客(41)
- 收藏
- 关注
原创 pthread_create编译问题
注意点:头文件 #include <stdio.h> #include <pthread.h>编译参数gcc main.c -o main -lpthread
2019-10-18 11:30:08 629
原创 运算符优先级引发的血案
案例:比如我希望对一个23bit的字段进行单字节分离,如:typedef struct _AAA{ js_u32 a:1; // 用户操作策略 js_u32 b:23; // 用户规则号 js_u32 c:8; // 用户输出组号}AAA;希望对b这个域,做单字节分离,有问题的代码如下:uint8_t buf[17] = {0};me...
2019-10-17 09:55:47 441 1
原创 C++全局变量在本文件内部和外部.cpp文件中的定义与使用
记录:情景:基于c++的代码:工程中有2个.cpp文件,分别为a.cpp、b.cpp,我希望在b.cpp中声明并初始化几个全局变量bbb1、bbb2、bbb3,同时这几个全局变量的值我需要在a.cpp中得到。需要做的工作:在b.h中定义全局变量,采用private的形式:private: js_u8 bbb1; js_u8 bbb2; js_u8 bbb3;定义获...
2019-09-29 17:18:24 1974
原创 查找某个目录下.c文件包含某个字符串的结果
find ./ -name "*.c" | xargs grep -nrws "rte_eal_init"xargs:find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部。grep -nrws:n: 在显示符合样式的那一行之前,标示出该行的列数编号。r:当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作w:匹配...
2019-09-16 20:32:52 569
原创 centos7 安装DPDK
参考:https://blog.csdn.net/weixin_28712713/article/details/100804163下载DPDK安装包我是下载的最新版本,dpdk-19.08,放在定义的目录下,解压:tar -xvf dpdk-19.08.tar.xz dpdk-19.08环境变量配置在dpdk-19.08下,创建一个dpdkenv的文件,在里面填充如下内容:1. ex...
2019-09-16 18:18:54 2833
原创 centos7下搭建samba
参考:https://www.cnblogs.com/muscleape/p/6385583.html分几步走:防火墙关闭 [zuoyp@localhost ~]$ systemctl stop firewalld.service [zuoyp@localhost ~]$ systemctl disable firewalld.service Removed symlink /e...
2019-09-16 15:29:50 378
原创 break和continue
breakbreak直接跳过后面的处理,跳出当前循环。break的作用域(如果他在多层循环内,那么只作用于最内层循环)①情况1:②情况2:continuecontinue不处理后续语句,直接开始一次新的循环;continue也只会影响最内层的循环;①情况1:②情况2:注意:这里指的都是跳出循环,对于if这类判断是不care的。...
2019-09-16 10:37:58 372
转载 linux-tcpdump抓包命令;
转载:https://linux.cn/article-10191-1.html讲的很详细,不错的一篇文章。
2019-09-15 16:51:58 155
原创 字符常量/字符变量 计算sizeof
字符常量如‘a’,用sizeof计算出来是1还是4?#include <stdio.h> int main(void){ printf("sizeof = %d\n", sizeof('a')); return 0;} 结果是:换种写法再看看:#include <stdio.h> int main(void){ ...
2019-09-12 15:40:39 900
原创 while、for循环
while学习while过程中,看到c primer plus最后介绍到:当你需要写一个计数while循环时需要具备3个要素:1.必须初始化一个计数器;2.必须计数器去和一个固定值作比较;3.每次执行循环,计数器的值必须递增;FEP:int num = 10;int i = 0;while(i < num){ ···xxx···; i++;}其实这里的三...
2019-09-11 17:28:02 256
原创 野指针和内存泄漏
野指针野指针是指指针变量在声明后未对其地址进行初始化,因为指针在声明后,它的地址都是随机指向的,如果不初始化成正确的值,会造成野指针的出现。还有就是在free或delete之后,没有对指针变量赋值为NULL。因为free或delete只是删除了这个指针所指向的内存,但是指针变量本身是存在的。通常判断一个指针是否合法,都是使用if语句测试该指针是否为NULL。规避:在声明指针变量后,...
2019-09-10 16:19:43 203
翻译 括号能否强制改变计算顺序
一般来讲,不行。f() + g() * h()尽管我们知道乘法运算在加法之前, 但这并不能说明这三个函数哪个会被首先调用。如果你需要确保子表达式的计算顺序, 你可能需要使用明确的临时变量和独立的语句。但是有一个比较特殊的地方,就是对于&&和||来说,他们只需要检测自己运算符的左边如果已经能决定结果,那么他们就不会再计算右边的表达式。&&对应于假,||对应于真。...
2019-09-10 15:52:43 807
原创 offsetof
这是一个C语言已有的库函数。在 <stddef.h>中。它的作用是计算成员变量在结构体中的偏移量。FEP:#include <stddef.h> #include <stdio.h> ...
2019-09-10 14:41:22 753
原创 size_t
size_t 是作为sizeof运算符的返回值它并不是一个新类型,其实是由typedef来实现的。typedef double aaa;是对double类型声明了新别名叫做aaa;size_t也是一样,typedef unsigned int size_t;或typedef unsigned long表明对unsigned int或unsigned long起了一个叫size_t的别名;在打印...
2019-09-09 16:11:29 687 2
原创 32位机和64位机各类型所占sizeof
通过sizeof可以算出来。32位编译器: char :1个字节 char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器) short int : 2个字节 int: 4个字节 unsigned int : 4个字节 float: 4个字节 double: 8个字节 long: 4个字节 ...
2019-09-01 22:09:00 840
原创 增加头文件编译不过的问题
情景:在a.c对应的a.h中增加头文件xxx.h,但是一直提示In file included from a.c:25:0:a.h:4:35: 致命错误:xxx.h:没有那个文件或目录 #include <xxx.h>分析:反复确认头文件名称 - - - 没错。经过询问同事,是因为在a.c所在文件的makefile中的CFLAGS没有增加对xxx.h路径的编译选项...
2019-08-26 17:46:23 1058
原创 数组与指针
关于数组首地址问题定义一个char型数组char a[3] = {'1', '2', '3'};。Q1:a,a + 1,&a,&a+1有什么区别?A1:首先a,我们一般用数组名来表示这个数组的首地址,但其实这是不太准确的。a代表的实际山是数组首元素的首地址,而real的数组首地址是用&a来表示的。虽然他们两个的值相同,但意义是不一样的,不一样在哪里呢?下个问题解答。...
2019-08-23 14:04:00 177
原创 strcpy/strncpy/strcat/strncat/memcpy这类库函数
首先列出这些常用库函数的函数原型strcmpstring.hint strcmp(const char *s1, const char *s2);负数、零还是正整数,依赖于 s1 所指向的字符串是小于、等于还是大于 s2 所指的字符串。strncmpstring.hint strcmp(const char *s1, const char *s2, size_t n);负整数、零还...
2019-08-22 18:06:44 298
原创 大小端问题
A:什么是大端、小端?Q:大端:低地址存放高字节。小端:低地址存放低字节。高字节/低字节:比如0x12345678,那么0x12是高字节,0x78是低字节。大端机器存放上述为0x12345678;小端存放为:0x78563412。A:如何判断一个机器是大端还是小端Q:使用联合体;因为联合体是共享同一块内存地址的,在同一块内存地址同时存放2个字节和1个字节,那么通过观察那1个字节的值,就可...
2019-08-22 15:51:08 224
原创 指针常量 常量指针 const
情况1:常量指针(前有狼)看名字,常量在前,修饰指针,所以表达式为const int * p;因为const修饰的是int,所以表示这个p的值是常量,是无法被修改的(这种操作是不对滴:*p = 1;),但p所存放的地址是可以修改的(这种操作就是对滴了:p = 0x111;)。情况2:指针常量(后有虎)看名字,常量在后,跟上面反着的,表达式为int * const p;因为const修饰的...
2019-08-22 15:38:53 180
原创 static
参考:https://www.cnblogs.com/stoneJin/archive/2011/09/21/2183313.htmlstatic的作用隐藏定义成“静态”,就表示对外部是不可见的。比如静态局部 他的可见域就是在本函数内。对外部其他函数不可见。比如静态全局 他的可见域就是在本.C文件内且是从他定义的位置开始往下。对外部其他文件不可见。保值“保值”意思就是一旦...
2019-08-22 14:34:09 192
原创 各类变量类型的范围
有符号类型名称字节数取值范围signed char1-128~+127short int2-32768~+32767int4-2 147 438 648~+2 147 438 647long int4-2 147 438 648 ~ +2 147 438 647long long int8-9 223 372 036 854 ...
2019-08-21 14:40:28 560 1
原创 关于main函数
每个函数都要有函数体,但main函数可以是空的,什么内容都没有。但是这样的函数有什么作用?void main() {}问:它的作用在哪?答:没作用?那不能。当你的.C文件包含很多函数时,你可以在里面声明一些空函数,确定需要完成的工作,把思路通过定义空函数的方式整理出来,后续再往这些空函数接口中填充代码。这样可以帮助你条理、系统的建立程序。...
2019-08-21 10:06:22 558
原创 预处理指令
符号“#”就表示这是一个预处理指令。他告诉编译器在编译程序之前要先执行“#”后跟着的动作。预处理指令很多,大都放在头文件中。所以定义的许多宏(#define xxx xxx),按规定是不被允许放在.C文件内的。比如#include <stdio.h>,stdio 是 standard input/output缩写。头文件命不区分大小写...
2019-08-21 09:59:08 189
原创 fwrite、fopen、fread操作结构体
函数原型size_t fwrite(const void *ptr, size_t size, size_t nobj, FILE *stream)fwrite 函数从 ptr 指向的数组中读取 nobj 个长度为 size 的对象,并输出到流 stream 中。它返回输出的对象数目。如果发生错误,返回值会小于 nobj 的值。size_t fread(void *ptr, size_t ...
2019-08-02 15:02:37 1187
原创 比较字符串 strcmp
错误示范这里比较的并不是2者的内容,而是string和"value"的地址是否一致;正确示范strcmp函数原型:函数体内部实现:strcmp(const* char1, const* char2) { while((char1 != '\0') && (char1 == char2)) { char1++; char2++ } int i...
2019-08-02 09:45:45 536
原创 main的返回值问题
main的返回值只能是int型,不能是其他类型比如void,所以在声明main时,只能有两种方法:int main(void);或int main(int argc, char **argv);
2019-08-01 18:05:20 389
原创 如何用typedef定义一对相互引用的结构?
有问题的版本希望在AP结构体中,引用BP,但是编译器会报错:因为在编译器第一次遇到BP时,BP还未定义。解决办法第一步我们不使用typedef,直接使用struct来定义结构a和结构b:这样的结果在编译时是可以通过的:相当于a, b 在这里都是空声明;第二步在用typedef 去定义两个类型:OK,可以编译通过。这样就解决了用typedef互相引用冲突的问题了。总结...
2019-08-01 16:26:38 676
原创 关于typedef和#define的区别
概念typedef关键字是用来定义新的类型名称,而不是定义新的变量或函数;#define:在C或C++语言源程序中允许用一个标识符来表示一个字符串,称为“宏”;使用与区别一般最好使用typedef,因为在涉及指针类型名称的声明时,他可以很好地处理;比如:typedef char* string_a;#define string_b char*;string_a s1...
2019-07-31 16:24:03 168
原创 给线程传递参数+pthread_join理解
为什么要这么做因为通过pthread_create接口可以看到int pthread_create(pthread_t *tidp, const pthread_attr_t *attr, (void*)(*start_rtn)(void*), void *arg);线程调用的接口start_rtn,是void *型,无法通过参数本身传递数据,而应该使用线程参数传递一个结构体或变量的指针来实现参...
2019-07-31 11:04:57 1350
原创 多线程创建
概念所有这些线程在同一个进程中执行同一个程序,但是每个线程在特定时间点上可能分别执行这个程序的不同部分。创建和被创建的线程同先前一样共享内存空间、文件描述符和其它各种系统资源。例如, 当一个线程修改了一个变量的值,随后其它线程就会看到这个修改过的值。相似的,如果一个线程关闭了一个文件描述符,其它线程也无法从这个文件描述符进行读或写操作。因为一个进程中所有线程只能执行同一个程序,如果任何一个线程...
2019-07-30 18:00:24 99
原创 Linux中关于信号的学习
定义信号首先是由一堆宏定义来声明的,它们存放在/usr/include/bits/signum.h中。其中,比较常用的SIGINT、SIGABRT、SIGBUS、SIGKILL、SIGSEGV、SIGSYS;使用进程可以相应系统发来的信号,同时也可以向其他进程发送信号。当操作错误总线或出现段错误时,就会收到系统的SIGBUS、SIGSEGV的信号;如果你想对其他进程进行“嘿嘿嘿”的动作时...
2019-07-30 15:42:42 111
原创 关于gcc的一些学习
参考博客:https://blog.csdn.net/BobYuan888/article/details/88709449编译4步C源文件到可执行文件共经历了4个过程。包括预处理、编译、汇编、链接。为了方便好记,可以采用记录单条编译命令的方式,这样可以把命令也一起记下来。比如(ESCO)。预处理# gcc -E main.c > main.igcc --h的解释:-E ...
2019-07-30 11:42:03 257
原创 关于git提交流程
这里只简单讲下git提交基础流程git 提交流程# git pull //拉取远端最新的代码到本地# git status //查看当前状态(包括修改的文件,后续提交结束在执行这个命令会提示“干净的工作区”)如果代码可编译,为确保无误,可以先到对应目录下执行编译,保证能编过。编译完成。通过#git status命令精选查看当前待修改点:[root@localhost libjs_j...
2019-07-29 15:46:48 177
原创 异常返回时释放内存
如题其实这个是一个细节问题,比如申请了一段内存,但是在中途返回了,这时如果忘记对之前申请的内存进行释放,后续其他地方访问到这里会造成内存泄漏。例如#include <fcntl.h>#include <stdlib.h>#include <sys/stat.h>#include <sys/types.h>#include <uni...
2019-07-24 14:33:10 224
原创 回调函数
定义简单来说,回调函数是由别人的函数执行时调用你实现的函数。函数指针作为某个函数的参数。函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。以下是来自知乎作者常溪玲的解说:你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调...
2019-07-23 18:47:16 167
原创 关于函数指针与指针函数
概念函数指针:是指向函数的指针变量。通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。函数指针可以像一般函数一样,用于调用函数、传递参数。指针函数:顾名思义就是带有指针的函数,即其本质是一个函数,只不过这种函数返回的是一个对应类型的地址。声明函数指针变量typedef int (*fun_ptr)(int,int); // 声明一个指向同样参数、返回值的...
2019-07-23 18:25:35 206
原创 关于likely、unlikely、__builtin_expect的学习
likely、unlikely、__builtin_expect的关系#define likely(x) __builtin_expect((x),1)#define unlikely(x) __builtin_expect((x),0)
2019-07-17 18:07:59 409
原创 assert
关于assert系统函数assert使用assert一般用于检测函数参数的合法性,攻城狮们可以自己封装Assert作为宏,比如:#define Assert(condition){ if (condition){ NUll; } else { Assert(__FILE__ , __LINE__); }} while(0)调用时,像这样:void Test(uns...
2019-07-15 16:58:23 2232
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人