C语言
文章平均质量分 79
一口Linux
《从零开始学ARM》作者,长期分享嵌入式、linux、网络、arm知识。
展开
-
新员工一口气写完了这些C语言例子,领导给他转正了!
持续更新中…很多想从事嵌入式Linux开发的老铁问一口君,有没有快速提升自己编程水平的小例子?一口君根据自己多年工作经验,整理了一些基于Linux的c语言的非常实用的小例子,这些例子在嵌入式开发工作中,或多或少都会用到。看看你们会做多少?原创 2024-09-02 22:19:44 · 832 阅读 · 0 评论 -
让你的C程序,可以自动更新版本信息
date 能用来显示或设定系统的日期和时间,在显示方面,使用者能设定欲显示的格式,格式设定为一个加号后接数个标记。后续彭老师会单独在写一篇,一个比较经典的版本号管理实例文章,有兴趣的老铁可以关注下彭老师的号。中的内容,我们可以字节编写c程序修改,也可以直接使用命令date,本文主要讲解如何在编译的时候就给软件自动添加更新软件版本的功能,若是不以加号作为开头,则表示要设定时间,而时间格式为。大家可以根据自己需要,自己定制自己需要的版本号格式,厂家提供的sdk,往往都有git本地仓库,原创 2024-08-16 00:42:08 · 1029 阅读 · 0 评论 -
如何让你的C语言程序打印的log多一点色彩?(超级实用)
接着上一篇文章《在平常的调试中,printf字体格式与颜色都是默认一致的。如果可以根据log信息的重要程度,配以不同的颜色与格式,可以很方便的查找到要点。原创 2024-07-28 22:02:10 · 857 阅读 · 0 评论 -
由字节对齐引发的一场“血案“
最近在搞个网络通信协议,采用socket udp传输,运行时,居然报段错误了,经过debug,发现居然是因为字节对齐问题导致的。这个问题在实现通信协议,是经常会遇到的问题,为了方便读者理解,我把内容做了简化,分享给大家。原创 2024-07-27 10:36:51 · 360 阅读 · 0 评论 -
C语言|图解指针变量
函数(如下例的funcForSpace())内定义局部变量(如下例的a)保存在一个函数的栈帧上,当一个函数执行完毕后,另一个函数(如下例的stackFrame_reuse())执行时,该空间会被stackFrame_reuse()重复使用,a所使用的空间将不复存在,所以当一个指针变量指向局部变量的内存空间时,其地址值传递给主调函数时,并不是一个有效值。二维数组是数组的数组,n维数组是n-1维数组的数组。指针变量的值就是其指向的空间的地址,指向的地址的空间大小就是指针变量指向类型的大小。原创 2022-10-18 23:34:07 · 2317 阅读 · 0 评论 -
C语言实现url解析小实例
前言前面一口君写了一篇关于url的文章:《一文带你理解URI 和 URL 有什么区别?》本篇在此基础上,编写一个简单的用于解析url的小例子,最终目标是解析出URL中所有的数据信息。程序流程图...原创 2022-03-17 20:48:45 · 3195 阅读 · 2 评论 -
手把手教你如何实现一个简单的数据加密算法
0. 前言之前写过一篇关于MD5的文章,很多老铁说能否出一篇关于加密的文章吗?《C语言实现MD5,竟如此简单!》一口君的字典里没有"不行"这两个字!必须安排!关于加密的一些基本概念,大家可以参考下面这一篇文章:《公钥密码学简介》本文,一口君带着大家自己实现一个简单但也很实用的加密方法。让大家了解实际工作中数据加密的流程。一、一种常见的网络通信的加密流程下图是一个常见的网络通信加密的应用场景。如上图所示,基于C/S架构的服务器和客户端通信模型,假定:客户端服务器都有自己的密码机(可原创 2021-11-10 19:34:17 · 5313 阅读 · 2 评论 -
如何解析hdlc帧7E头(帧格式分析实例)
0. 前言作为一名嵌入式工程师,经常需要通过UART与外设打交道,而对于串行总线来说,往往我们必须要进行帧同步。通常的做法是把信令包含在2个0x7E的中间。除此之外还有HDLC、PPP等协议也会到有此应用场景。那么如何从这些数据帧中提取有效数据呢?本文通过一个简单的实例给大家详细讲述如何从帧中提取有效的协议信令。1. 帧格式要求首先我们明确下帧提取的一些要求:(1)把信息字段中出现的每一个0x7E字节转变为2字节序列(0x7D,0x5E)。(2)若信息字段中出现一个0x7D的字节(即出现了原创 2021-10-27 08:26:08 · 2077 阅读 · 0 评论 -
Makefile实例,利用Makefile给多文件、多目录C源码建立工程
前言粉丝留言,想知道如何使用Makefile给多个文件和多级目录建立一个工程,必须安排!原创 2021-10-18 19:59:38 · 3456 阅读 · 0 评论 -
从0写一个电话号码管理的C入门项目【适合初学者】
0.前言上次发了一个嵌入式的学习路线,很多粉丝问我各个阶段的入门项目,其中第二阶段的《基于socket聊天室》写了4篇循序渐进的文章,而第一阶段的《电话号码本管理》也非常想要。一口君必须安排。该项目,一口君同样采用循序渐进的步骤,一点点为大家讲解这个小项目是如何从头开始点点写出来的。1.代码阅读方法1. 安装git2. 显示历史修改记录...原创 2021-09-06 22:07:43 · 834 阅读 · 3 评论 -
一文教你如何用C代码解析一段网络数据包?【含代码】
本文的目的是通过截取一段网络数据包,然后根据协议类型来解析出这段内存。学习本文需要掌握的基础知识:网络协议C语言Linux操作抓包工具的使用其中抓包工具的安装和使用见下文:《一文包你学会网络数据抓包》视频教学链接如下:《教你如何抓取网络中的数据包!黑客必备技能》一、截取一个网络数据包44 33 4C FF 5A 22 80 8F 1D C7 A6 07 08 00 45 00 01 5D B7 43 40 00 35 06 81 CE 3D AE 0C C5 C0 A8 00原创 2021-08-09 22:23:57 · 1721 阅读 · 0 评论 -
Linux字节对齐的那些事
字概念字(word)字是用于表示其自然的数据单位,字是电脑用来一次性处理事务的一个固定长度。字长一个字的位数,现代电脑的字长通常为16,32, 64位。(一般N位系统的字长是N/8字节。)为什么要对齐?操作系统并非一个字节一个字节访问内存,而是按2,4,8这样的字长来访问。因此,当CPU从存储器读数据到寄存器,IO的数据长度通常是字长。如32位系统访问粒度是4字节(bytes), 64位系统的是8字节。当被访问的数据长度为n字节且该数据地址为n字节对齐时,那么操作系统就可以高效地一次定位到原创 2021-08-05 23:28:38 · 687 阅读 · 2 评论 -
一文讲透CRC校验码-附赠C语言实例
一、什么是CRC?CRC(Cyclic Redundancy Checksum)是一种纠错技术,代表循环冗余校验和。数据通信领域中最常用的一种差错校验码,其信息字段和校验字段长度可以任意指定,但要求通信双方定义的CRC标准一致。主要用来检测或校验数据传输或者保存后可能出现的错误。它的使用方式可以说明如下图所示:在数据传输过程中,无论传输系统的设计再怎么完美,差错总会存在,这种差错可能会导致在链路上传输的一个或者多个帧被破坏(出现比特差错,0变为1,或者1变为0),从而接受方接收到错误的数据。为尽量提原创 2021-06-29 22:23:31 · 1724 阅读 · 2 评论 -
如何使用随机数实现自动发扑克牌?
一、粉丝问题二、相关函数说明1. 函数说明产生随机数的方法很多,常用的是rand()、srand(),来看一下这2个函数的定义:SYNOPSIS #include <stdlib.h> int rand(void); int rand_r(unsigned int *seedp); void srand(unsigned int seed);DESCRIPTION The rand() function re原创 2021-06-21 22:00:09 · 1428 阅读 · 0 评论 -
【粉丝问答25】函数指针定义的一个错误
1. 问题某个函数指针的使用:编译时出错了。type defaults to ‘int’ in declaration of ‘on_touch_messgae_handle’[-Wimplicit-int] typedef(*on_touch_messgae_handle)(touch_message_t);粉丝源码如下:2. 分析 1 struct touch_message原创 2021-06-15 21:44:48 · 1289 阅读 · 0 评论 -
【问答22】不懂指针类型,8个例子给你讲明白
知乎上回答了一个粉丝问题,结果这兄弟又连续问了几个问题:好吧,帮人帮到底,送佛送到西!给你讲彻底点吧!1. int va;这是一个整型变量,32位CPU的话,占有32个bite2. int *va;这是一个整型指针变量,用于存放一个整型变量的地址,3. int **va;这是一个整型的二级指针,用于存放一个内存的地址,该地址对应的内存中存放了另一个整型变量的地址比如:int va=0x12345678; int *pva = &va; int **ppva = &原创 2021-04-19 22:03:26 · 776 阅读 · 4 评论 -
【问答21】C语言:位域和字节序
1. 粉丝问题自己编写的一个协议相关代码,位域的值解析和自己想象的有出入。结构体的头:解析代码和测试结果:就是说通过函数hexdump()解析出的内存是十六进制是 81 83 20 3B …从数据帧解析出的opcode = 0x8该粉丝不明白为什么解析出的值是0x8。这个问题其实就是位域的问题和字节序的问题。测试代码废话不多说,直接写个测试代码#include <stdio.h>//简化的结构体struct iphdr { unsigned char fin:原创 2021-04-14 22:45:45 · 479 阅读 · 0 评论 -
C语言中结构体的位域(bit-fields)
有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:struct 位域结构名{ 位域列表原创 2021-04-13 22:45:17 · 1338 阅读 · 0 评论 -
【粉丝问答19】为啥变量没初始化就用了?那是宏定义啊!
问题为啥内核有的变量没有初始化就敢直接使用?分析看上图,其中的5747行的变量nid的确没有定义,就直接使用了,这么做没有问题吗?其实大家仔细看一下,5765行是一个宏,到内核源码去找该宏的定义:linux-3.14\include\linux\Nodemask.h#define for_each_online_node(node) for_each_node_state(node, N_ONLINE)其中的for_each_node_state又是一个宏,继续跟踪该宏,有两处定义4原创 2021-03-29 21:43:57 · 920 阅读 · 0 评论 -
【粉丝问答18】linux下查看函数被那些函数调用过?
一、问题有个打印log的函数,想知道该函数执行的时候,之前执行了哪些函数?二、分析在应用程序打印函数栈需要通过函数backtrace(),该函数对应头文件如下: #include <execinfo.h>1、三个与打印调用栈相关的函数打印函数栈需要使用到以下3个函数int backtrace(void** buffer, int size);函数功能:用于获取当前线程的调用堆栈。参数:buffer:它是一个指针数组,函数获取的当前线程的调用堆栈将会被存放在buf原创 2021-03-25 08:51:55 · 1118 阅读 · 2 评论 -
在Linux应用程序中打印函数调用栈
在Linux中打印函数调用栈要求在Linux系统的应用程序中写一个函数print_stackframe(),用于获取当前位置的函数调用栈信息方法execinfo.h库下的函数backtrace可以得到当前线程的函数调用栈指针和调用栈深度,backtrace_symbols可以将调用栈指针转化为字符串信息。详见Backtraces或在Linux命令行运行命令man backtrace.测试平台 Linux内核版本:Linux version 4.15.0-45-generic (bui...原创 2021-03-18 19:09:22 · 1019 阅读 · 0 评论 -
用C语言完整实现12种排序方法
排序方法(升序):1.冒泡排序2.插入排序3.折半插排序4.希尔排序5.选择排序6.鸡尾酒排序7.堆排序8.快速排序9.归并排序10.计数排序11.桶排序12.基数排序1.冒泡排序思路:比较相邻的两个数字,如果前一个数字大,那么就交换两个数字,直到有序。时间复杂度O(n^2),稳定性:这是一种稳定的算法。代码实现:void bubble_sort(int arr[],size_t len){ size_t i,j; for(i=0;i<len;i++){ b原创 2021-03-15 18:25:58 · 8075 阅读 · 0 评论 -
如何字符串拷贝函数的几种方法,你猜哪个效率最高?
strcpy,即string copy(字符串复制)的缩写。是C语言标准库中实现字符串拷贝的一个函数。问:你会如何实现这个函数呢?(10分)2分版本//2分void strcpy(char *strDest, char *strSrc){ while( (*strDest++ = *strSrc++) != '\0' );}4分版本//4分//将源字符串 strSrrc加const,表明其为常量输入参数,加2分void strcpy(char *strDest, const原创 2021-03-01 19:50:36 · 852 阅读 · 3 评论 -
归并排序c语言
1 void mergeAdd(int arr[], int left, int mid, int right, int *temp){ 2 int i = left; 3 int j = mid + 1; 4 int k = left;//临时下标 5 while (i <= mid&&j <= right){ 6 if (arr[i] < arr[j]){ 7 temp[k++] = arr[i++]; 8 .原创 2021-02-26 09:53:09 · 330 阅读 · 0 评论 -
可重入函数与不可重入函数
一. 不可重入函数 1.1. 什么是不可重入函数 a.在实时系统的设计中,经常会出现多个任务调用同一个函数的情况。如果有一个函数不幸被设计成为不可重入这样:那么不同任务调用这个函数时可能修改其他任务调用这个函数的数据,从而导致不可预料的后果。这样的函数是不安全的函数,也叫不可重入函数。 1.2. 不可重入函数产生 1.2.1.满足下列条件的函数多数是不可重入的 a.函数体内使用了静态的数据结构; b.函数体内调用了malloc()或者...原创 2021-02-24 19:01:49 · 321 阅读 · 0 评论 -
【粉丝问答12】如何计算函数的执行时间?
0、问题描述粉丝想计算一个函数的执行时间。一、问题分析函数的执行时间的统计在嵌入式系统中会被频繁的用到,知识点很重要。本文从两个方面来讨论类似的问题:程序内计算一个函数的执行时间计算一个程序的执行时间二、程序内如何计算一个函数的执行时间?1. 思路我们在执行函数前后分别记录下时间戳,然后计算两个时间戳的差值即可。我们需要借助函数clock_gettime来实现这个功能。看下该函数的定义:#include <time.h>int clock_gettime(cl原创 2021-02-23 20:47:19 · 580 阅读 · 0 评论 -
C语言/实现MD5加密
MD5算法也叫摘要认证原创 2021-02-19 11:40:11 · 1551 阅读 · 1 评论 -
【粉丝问答10】C语言关键字static的使用详解
程序包括哪些段一、static 变量static变量主要区分静态全局变量和全局变量、局部变量和静态局部变量之间的区别。1. 静态全局变量、全局变量全局变量静态全局变量生存周期程序运行到程序结束程序运行开始到程序结束作用域所有的代码只有当前文件可以访问代码段中位置全局数据区全局数据区作用域静态全局变量、全局变量2. 静态局部变量、局部变量局部变量静态局部变量生存周期函数调用到函数返回程序运行开始到程序结束作用域原创 2021-02-01 10:33:22 · 555 阅读 · 0 评论 -
看了这几个C语言例子,你一定和我一样连说5个卧槽,声音一次比一次大
曾经我一直以为自己C语言学的还挺好的,直到看到这几个例子。例一#include <stdio.h>main(int t,int _,char* a){ return !0<t?t<3?main(-79,-13,a+main(-87,1-_, main(-86,0,a+1)+a)):1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13? main(2,_+1,"%s %d %d\n"):9:原创 2020-09-02 08:23:23 · 1104 阅读 · 0 评论 -
20个常用的宏定义
写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性等等。下面列举一些成熟软件中常用的宏定义。1. 防止一个头文件被重复包含1#ifndefCOMDEF_H2#defineCOMDEF_H3//头文件内容4#endif2. 重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。1typedefunsignedcharboolean;/*Booleanvaluetype.*/2typedef...原创 2021-01-07 19:16:15 · 1201 阅读 · 1 评论 -
二叉树详解,包含代码
来源:https://segmentfault.com/a/1190000008850005【导读】:树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。在面试环节中,二叉树也是必考的模块。本文主要讲二叉树操作的相关知识,梳理面试常考的内容。请大家跟随小编一起来复习吧。本篇针对面试中常见的二叉树操作作个总结: 前序遍历,中序遍历,后序遍历; 层次遍历; 求树的结点数; 求树的叶子数; 求树的深度; 求二叉树第k层的结点个数; ..原创 2020-12-02 18:45:14 · 395 阅读 · 0 评论 -
什么是状态机?用C语言实现进程5状态模型
前言状态机在实际工作开发中应用非常广泛,一口君曾经做过很多网络协议模块,可以说很多协议的开发都必须用到状态机;一个健壮的状态机可以让你的程序,不论发生何种突发事件都不会突然进入一个不可预知的程序分支,本篇通过实现一个简单的进程5状态模型的状态机,让大家熟悉一下状态机的魅力。定义有限状态机(finite-state machine,缩写FSM),又叫有限状态机自动机,简称状态机。是能够表示有限个状态以及这些状态之间的转移和动作等行为的数学模型。在计算机科学中,有限状态机被广泛用于建模应用行为、硬件电路系原创 2020-10-13 08:43:49 · 10349 阅读 · 8 评论 -
C语言 static变量和函数详解
概述static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护。但是对于c语言初学者,static由于使用灵活,并不容易掌握。本文就static在c语言中的应用进行总结,供参考使用。错漏之处,请不吝指正。最后一节加入了c++面向对象中static的使用特性,当作拓展阅读。在程序中使用static变量1. 局部变量普通局部变量是再熟悉不过的变量了,在任何一个函数内部定义的变量(不加static修饰符)都属于这个范畴。编译器一般不对普通局部变量进行初原创 2020-11-14 09:25:03 · 3281 阅读 · 1 评论 -
盘点C语言那些D炸天的单行代码
一、打印unix这是1987年C语言乱码大赛之最优秀单行代码:printf(&unix["\021%six\012\0"], (unix)["have"] + "fun" - 0x60);执行结果关于这段代码的解释,大家直接搜索一下即可。本文就不详解了。如果你的同事在项目里写这样的代码,直接友尽二、 c语言从1打印到100再打印到1#include <stdio.h>int main(int c, char **v) { return c < 100 ?原创 2020-10-18 14:38:06 · 488 阅读 · 0 评论 -
C语言中的短路现象
短路现象1比如有以下表达式 a && b && c只有a为真(非0)才需要判断b的值;只有a和b都为真,才需要判断c的值。举例求最终a、b、c、d的值。main(){ int a,b,c,d; a = 0; b = 1; c = 2; d = a++ && b++ && --c; printf("a=%d b=%d c=%d d=%d\n",a,b,c,d);}因为a++是先判断a的值再自加,而a原创 2020-09-23 21:34:34 · 1078 阅读 · 0 评论