C
文章平均质量分 76
brahmsjiang
这个作者很懒,什么都没留下…
展开
-
从 typedef struct T *T 看C语言的命名空间
最近在看《C语言接口与实现》一书. 第二章提到, 一个ADT(抽象数据类型)就是一个借口, 其标准范例是栈. 其接口定义如下所示:众所周知宏定义的作用仅仅是一个替换而已, 因此typedef这句话实际为:按照书上说法, Stack_T对外接口表现为一个“不透明指针”. 我起初理解是, 以后凡是看到Stack_T的地方实际指代的都是指针Stack_T*. 乍看起来这种理解没错, 但看一下栈的实现后, 便发生了理解不能的事情:这里#define 指令又把T定义为Stack_T的缩写. 问题来了原创 2022-07-02 17:30:35 · 612 阅读 · 0 评论 -
cpu的位宽、操作系统的位宽和寻址能力的关系
cpu的位宽暂时没有严格的定义,但是一般从数值上来讲:cpu的位宽 = 数据总线的位宽 = cpu内部通用寄存器的位宽 = 机器字长放出一个百度百科对于机器字长的定义供大家理解概念:CPU的寻址能力与它的地址总线位宽有关,与数据总线宽度(CPU位宽=数据总线位宽)无关。16位CPU的地址总线位宽可以是20位,32位CPU的地址总线可以是36位,64位CPU的地址总线位宽可以是40位。NOTE:CPU内部寄存器之间、CPU和外设的数据交互是通过总线来实现的,下图展示了cpu和外部设备(存储器和IO)之间的总线转载 2022-06-30 16:44:04 · 3856 阅读 · 1 评论 -
gcc头文件依赖顺序所遇到的坑
公司的genmake编译系统是用python对ninja + gcc所写的一个wrapper, 最终编译命令诸如:[100%] ${GCCPREFIX}/home/lajiang/.genmake/artifactory/toolchain/arm_gcc-8.3.0_glibc-2.28-x86_64-linux-gnueabihf/bin/arm-cisco-linux-gnueabihf-gcc -D_GNU_SOURCE -isystem platform/compiler/glibc -D_原创 2022-05-11 21:03:19 · 572 阅读 · 0 评论 -
linux dlopen 相关
dlopen(3) - Linux手册页名称dladdr,dlclose,dlerror,dlopen,dlsym,dlvsym - 动态链接加载器的编程接口概要#include < dlfcn.h >void * dlopen(const char * f...转载 2019-11-21 10:08:20 · 916 阅读 · 0 评论 -
几个C库string函数及其注意事项
这些函数都必须 #include <string.h>这周突然和C库string处理函数杠上了。说这个不是没有原因,其一是公司项目要求提升I/O的performance,原先使用C++的getline每次读取一个6M的文件直到读完为止,网上资料查到使用fget并配以strtok能大幅提升效率;其二正自学到《Linux高性能服务器编程》的第8章,其例子用的是原生C库函数来对http的r...原创 2019-08-23 23:51:25 · 266 阅读 · 0 评论 -
stdarg.h 可变参数宏的使用
要实现一个可变参数的函数,流程如下:1.定义一个函数,该函数有固定参数,且最后一个固定参数后面是可变参数(用“...”表示)2.在该函数体内定义va_list类型的变量3.用va_start宏将该变量初始化为一个参数列表,其指向可变参数列表的第一个元素(即在使用时,匹配固定参数后面的第一个实参)4.将此变量作为va_arg宏或vsnprintf等函数的参数,访问这个可变参数列表里面的元素5.用va...原创 2018-02-25 01:14:55 · 353 阅读 · 1 评论 -
单链表的创建和反转(C语言)
总是会想,等进入一个相对稳定的公司(环境)后,我再努力,再搞数据结构和算法、再搞懂公司的框架、再学好shell和python,时间总是充裕的。殊不知秉承着这样的思想,只是吃不起苦而找借口的一种变体罢了。生活总会以平等的方式来回报你。只要涉及当场手写代码的面试便碰壁,目前为止顺利的只有创业型小公司和外包而已。这想必也反映了我现在的水平吧。我祈求自己以后能将每一天物尽其用,走出自我易满足而选择ea原创 2018-03-03 14:01:33 · 977 阅读 · 0 评论 -
用std::map、std::sort、冒泡对deque进行排序(C/C++)
同样是一道面试题,函数参数类型是deque。deque是双端队列属于动态数组类型,没有sort成员函数,只有借助其他算法或者支持排序的容器,拷贝回deque。(练习而已,时间空间复杂度不考虑了)一、直接调std::sort,参数分别为起始迭代器,结尾迭代器(指向末元素的后面一个):#include <iostream>#include <deque>#incl...原创 2018-03-10 01:36:26 · 5791 阅读 · 3 评论 -
两种分治排序:归并排序和快速排序(C语言)
归并排序:思想为:在对待排序列设置一个中心点,以此为界左右进行拆分。在左子序列和右子序列递归执行上述过程,直到每个序列只有一个元素,拆分不动为止。然后对相邻元素进行合并。待合并完成为一个大序列后,对相邻的大序列递归执行这个过程,到整个序列的左、右序列合并完了,整个排序便完了。合并思想为:搞两个指针分别指向左、右子序列的头元素。开辟一个新数组存放结果,大小等同于左右子序列的和。通过俩指针逐个...原创 2017-12-26 17:26:28 · 1490 阅读 · 0 评论 -
C/C++ static 关键字
C:局部静态变量:在声明时即被首次初始化(默认为0),以后调用不再初始化。生命周期从初始化直到程序结束,保存在数据段。只对局部作用域可见。全局静态变量:在声明时即被初始化(默认为0),生命周期从初始化直到程序结束,保存在数据段。只对本文件可见。全局静态函数:只对本文件可见。C++:静态数据成员:不隶属于任何一个对象实例,可理解为类的一个属性。生命周期从初原创 2018-01-03 22:54:45 · 220 阅读 · 0 评论 -
socket实现简易echo time等功能
学了APUE里的套接字,敲了实验楼里的epoll例子。却刚意识到从未用POSIX socket API来自己真正写个C/S端。例子也就参照老掉牙的echo,time:客户端发送cmd,服务端根据收到的cmd字符串执行相应的获取时间、回显等功能。C/S编程模型:先上服务端代码:#include //socket#include //setsockopt#include原创 2018-01-01 19:38:46 · 464 阅读 · 0 评论