c
文章平均质量分 77
Leon_George
一只始终飞翔在嵌入式Linux ARM开发中的黑鸟,对bootloader、跟文件系统和Linux内核裁剪,以及对Linux底层应用和驱动开发也有些许心得。有志同道合的同学请关注我哦。
展开
-
基础C语言知识串串香11☞宏定义与预处理、函数和函数库
源码.c——> (预处理)——>预处理过的.i文件——>(编译)——>汇编文件.S——>(汇编)——>目标文件.o->(链接)——>elf可执行程序预处理用预处理器,编译用编译器,汇编用汇编器,链接用链接器,这几个工具再加上其他一些额外的会用到的可用工具,合起来叫编译工具链(gcc就是一个编译工具链)。-E:只预处理不编译(执行头文件的扩展、宏替换、条件编译筛选、去掉注释等),生成.i文件-S:只编译不汇编(将C/C++语言程序翻译成汇编语言),生成.S文件-c。原创 2024-06-23 21:03:22 · 676 阅读 · 0 评论 -
C语言核心知识点大汇总
本文搜罗了C语言的各种疑难易混淆的知识点,对于有一定C语言基础,但离实际运用有稍显不足的同学参考原创 2022-10-23 19:34:48 · 807 阅读 · 0 评论 -
详解linux内核链表list_head
Linux内核中的链表通常都组织成双向循环链表,不同于一般意义上的链表,这里的链表节点只含有链表指针(next和prev),没有链表的数据。Linux内核中使用的链表源代码位于` include/linux/list.h`中,下面详细叙述。转载 2022-08-21 22:45:04 · 1024 阅读 · 0 评论 -
嵌入式邻域面试官必问的问题
简介:本文汇总了嵌入式行业在校招或者社招中,笔试和面试常问或常考的题目,很多都是基础知识,但需要你对问题有个深刻的认识和理解。话不多说,请看汇总:本文参考:小米嵌入式研发工程师校招面试总结1、C语言基础1、const、static、volitale关键字const: 只读关键词,要求其所修饰的对象为常量,不可对其修改和二次赋值操作(不能作为左值出现)。使用场景:使一个变量只读,不可改变,需要先初始化;对于一个指针而言,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者转载 2022-04-23 10:34:27 · 2321 阅读 · 0 评论 -
Makefile语法及通用模板
简介:本文主要讲解了在开发常规项目时,用于自动化部署生成目标文件的Makefile。对其包含的主要语法进行了讲解,最后给出了一个项目通用的Makefile模板,以帮助大家理解。1. Makefile 三要素目标依赖命令目标:依赖(文件、其它目标)<tab>命令1<tab>命令2<tab>命令3target1:target2 target3 echo "target1" target2: echo "target2" target3.原创 2022-04-05 23:37:54 · 2008 阅读 · 2 评论 -
C语言构建环形缓冲区
它逻辑上是一个首尾相连的FIFO结构,具体实现上采用简单的线性数组。通过额外的辅助标志(head、tail)能很快知道队列的使用情况(是满还是为空)。正因为其简单高效的原因,甚至在硬件都实现了环形队列。环形队列广泛用于网络数据收发、程序间的大量数据交换(比如内核与应用程)、硬件接收大量数据。1、环形缓冲区原理环列队列逻辑上将数组元素array[0]与array[LEN-1]连接起来,形成一个存放队列的环形空间。实际操作中为了方便读写,采用head和tail分别指向可以读的位置和可以写的位置。环形原创 2021-08-29 00:02:10 · 6784 阅读 · 5 评论 -
一文搞懂getchar()和putchar()的奇怪现象
1、首先来看一个例子:#include <stdio.h>int main( ){ int c; c = getchar(); while (c != EOF){ putchar(); c= getchar(); } return 0;}这里主要解释下为什么要用int型来接受getchar函数。很多时候,我们会写这样的两行代码:char c;c = getchar();这样就很有可能出现问题。因为getchar函数除了返回终端输入的字符外,在遇到Ct原创 2021-08-28 21:08:50 · 2919 阅读 · 0 评论 -
C语言常见错误和技巧一文打尽
1、技巧类1.1 宏利用宏的替换,编写任意类型的交换函数#include <stdio.h> #define SWAP(t, a, b) \do \{ \ t c = a; \ a = b; \ b = c; \}while(0)int main( ){ int原创 2021-08-07 21:05:07 · 639 阅读 · 0 评论 -
基本输入输出函数
getc int getc(FILE *fp) getc 函数返回 fp 指向的输入流中的下一个字符。如果到达文件尾或出现错误,该函数将返回EOF,getc 从文件中返回下一个字符,它需要知道文件指针,以确定对哪个文件操作。 ...原创 2017-09-23 19:48:50 · 131 阅读 · 0 评论 -
变长参数表函数的编写
以实现函数 printf 的一个最简单版本为例,介绍如何以可移植的方式编写可处理变长参数表的函数。因为我们的重点在于参数的处理,所以,函数 minprintf 只处理格式字符串和参数,格式转换则通过调用函数 printf 实现。 函数 printf 的正确声明形式为: int printf(char *fmt, ...) ...原创 2017-09-23 16:05:41 · 138 阅读 · 0 评论 -
霍夫曼编码及译码
在这里详细附上实际可运行的C 语言程序图,其中已祥实的添加了附注。如有不懂的同学可留言提问。 图片发自简书App 图片发自简书App 图片发自简书App 图片发自简书App 图片发自...原创 2017-09-04 18:43:46 · 261 阅读 · 0 评论 -
存储管理函数
函数 malloc 和 calloc 用于动态地分配存储块。 函数 malloc 的声明如下: void *malloc(size_t n) 当分配成功时,它返回一个指针,设指针指向 n 字节长度的未初始化的存储空间,否则返回NULL。 函数 calloc 的声明为 ...原创 2017-09-23 19:54:25 · 119 阅读 · 0 评论 -
函数运行时的内存分配
按照内存地址高→低的顺序,函数运行时内核分别为其分配了全局区,常量区,堆,栈,代码区。下面分别讲解☞) 1/全局区0x42......(全局变量,静态变量,局部静态变量,全局静态变量,它们在进入主函数前就已经被初始化,且全局变量可以通过extern声明被跨文件调用)。 a☞局部静态变量退出函数后再次进入时,不再继续初始...原创 2017-06-09 13:41:31 · 311 阅读 · 0 评论 -
链表的实用操作函数
单向链表的操作 /*链表节点声明*/ typedef struct listnode *listpointer; struct listnode { int date; // element else listpointer link; ...原创 2017-06-14 16:49:17 · 191 阅读 · 0 评论 -
Balabala函数的启动和退出机制
在linux系统中,启动一个可执行程序program,便在内核中生成一个进程process,且被内核赋予一个唯一的非负整数的进程号PID(process ID)。内核通过一个task_struct结构体(进程表项/进程控制块)维护和记录该进程的所有信息,例如进程状态state,优先级priority,终端信息tty_struct,目录信息fs_stru...原创 2017-06-07 17:32:51 · 163 阅读 · 0 评论 -
C编程玩转魔方游戏
Hello,大家好。今天和大家分享一个趣味数学的魔方问题。相信之前,你们都玩过《某者》或寒暑假作业后面的趣味填数游戏。给你一个某种大小的矩阵(一般都是奇数3x3, 5x5, 7x7...), 每个单元取自然数,简单点的会先给你填好几个数字,要求你填出剩下的空格,使每行、每列,以及两条主对角线的和都相等。 空格最大数字为25.最小为1...原创 2017-05-31 10:45:42 · 476 阅读 · 0 评论 -
各种alloc傻傻分不清楚
很多新学C语言的童鞋在用到动态内存分配与使用的时候,对如何选择各种分配函数及其底层区别搞不清楚,那么下文就认真的讲讲它们的种种。 (1)C语言的内存分配方式 <1>从静态存储区域分配. 这种方式主要是系统用于自动分配给全局变量、static变量内存...原创 2018-09-15 17:38:31 · 450 阅读 · 0 评论 -
char *name和char name[ ]的区别
在编程中我们经常会遇到向程序输入一个字符串的情况。此时,我们会有两种选择:一是定义一个字符指针,并把该字符串首字符的地址传给他;二是定义一个字符数组,并把字符串存入该字符数组中。 那么这两种方法有什么区别呢?请大家看下面这段代码: 图片发自简书App 大家想想,这段代码能正常运行吗? ...原创 2017-11-30 12:48:58 · 1824 阅读 · 0 评论 -
C语言中三种输入函数的区别
在C语言中,有三种主要的输入函数:scanf(),fgets()以及gets()。他们的使用方法及注意事项如下: 1.scanf() 它是一种格式化的输入方式,可一次性按照规定的格式输入多个数据域。下面以输入规定的长度的字符串为例,来说说它的使用方法和容易产生的bug。 要求:定义一个长度为10的个字符数组...原创 2017-11-29 21:58:14 · 555 阅读 · 0 评论 -
解剖getchar和putchar
一、首先来看一个例子: #include <stdio.h> int main( ) { int c; c = getchar(); while (c != EOF) { putchar(); c= getchar(); } ...原创 2018-09-16 13:27:46 · 200 阅读 · 0 评论 -
unix系统中实现读写的原子操作
众所周知在早期版本的Unix系统中,读函数read() 和写函数write()中并没有O_APPEND这一选项。所以为了在文件的末尾添加内容的话一般是分两步走:1:lseek(fd,0L,2)/*将文件位置指针定位到文件末尾*/2:write(fd,buf,size)/*将buf中的size个字节写入文件*/但这里有一个问题就是,如果系统是支持多进程的话,就会有可能发生错误。因为如...原创 2018-10-29 23:42:13 · 407 阅读 · 0 评论 -
open函数及其与openat函数的区别
一、原型#include <fcntl.h>int open(const char *path, int oflag, mode_t mode);int openat(int fd, const char *path, int oflag, mode_t mode );函数执行成功返回文件描述符,失败返回-1.二、相同点当传给函数的路径名是绝对路径时,二者无区...原创 2018-10-28 16:24:44 · 9171 阅读 · 2 评论 -
让你的程序飞起来
本方法可以让C语言指令进一步接近汇编指令的执行效率,提高单片机、嵌入式系统的速度和稳定性,但编程时应采取函数化的编程法——例如使用swap()函数时,必要时加注释。0. 位运算心法&(与逻辑):有0出0,全1出1;|(或逻辑):有1出1,全0出0;~(非逻辑):空即是色,色即是空;^(异或):相异出1,相同出0;1. 如果乘上一个2的倍数数值,...原创 2019-02-14 11:57:08 · 305 阅读 · 0 评论 -
C与C++的差异
c语言是结构化模块化的语言,是面向过程的程序设计。c++既可以面向过程,也可以面向对象的程序设计(增加了面向对象机制)。c语言的头文件都有.h后缀名,c++中用户自己编制的头文件带.h,系统提供的头文件无后缀名,c++兼容c的头文件。c语言的结构体struct只能包含数据成员,c++的类可以包含数据成员和成员函数。c++中使用usingnamespace作为命名空间,当含有系统头文...原创 2019-02-11 21:24:36 · 342 阅读 · 0 评论 -
指定初始化的运用
我们在拜读Linux内核源代码时,是否会经常遇到一些既熟悉又陌生的C语言语法?熟悉是因为我们对Linux内核中使用的C语法绝大部分都能够看懂。陌生是指内核源代码当中的个别语法运用,我们在普通的C教材中并没有提及和说明。那么,从今天开始,小编将发表一系列文章具体阐述Linux内核中使用的那些我们那些看起来很陌生的语法。一、指定初始化1、数组元素的指定初始化在标准C中,当我们...原创 2019-02-14 08:43:07 · 186 阅读 · 0 评论 -
动态分配那些事儿
当编写程序时,偶尔会不确定数组的大小(包括存储字符串的数组)。较为方便的做法是等到程序运行时再来确定数组的实际大小。在标准C中,提供了3个库函数:malloc(),calloc()和realloc()。那么他们有什么区别,分别用在什么场合呢?malloc()函数函数原型:void * malloc(size_t num_byte)参数介绍:一般来说,如果申请成功会它返...原创 2019-02-09 08:38:12 · 124 阅读 · 0 评论 -
说说动态内存分配
当编写程序时,偶尔会不确定数组的大小(包括存储字符串的数组)。较为方便的做法是等到程序运行时再来确定数组的实际大小。在标准C中,提供了3个库函数:malloc(),calloc()和realloc()。那么他们有什么区别,分别用在什么场合呢?malloc()函数函数原型:void * malloc(size_t num_byte)参数介绍:一般来说,如果申请成功会它返...原创 2019-02-20 17:35:23 · 132 阅读 · 0 评论 -
标准库
C语言的标准库总共分成十五个部分,每个部分用一个头描述。许多编译器都会使用扩展后的库,因此,包含的头通常会多于十五个。额外添加的头当然不属于标准库的范畴,所以,我们不能假设其他的编译器也可以支持这些头。而这些头通常提供一些针对特定机型或特定操作系统的函数,他们可能会提供对屏幕或键盘更多的操作函数,用于支持图形或窗口界面。标准头主要由函数原型、类型定义以及宏定义组成。如果我们的文...原创 2019-02-15 20:21:46 · 1707 阅读 · 0 评论 -
妙用typeof关键字
ANSI C定义了sizeof关键字,用来获取一个变量和数据类型在内存中所占的存储字节数。GNU 扩展了一个关键字,typeof用来获取一个变量或表达式的类型。int i;typeof(i) j = 20;typeof(int *) a;int f();typeof(f()) k;在上面的代码中,因为变量i的类型为int,所以typeof(i)就等于int,typeo...原创 2019-02-21 08:48:44 · 166 阅读 · 0 评论 -
函数的宏定义
首先给大家普及一个知识点:C标准库里的每一个库函数都有一个同名的宏定义。但为什么要为每一个函数定义一个同名宏呢?原因在于在一些反复调用同一函数的场合,编译器可以用函数宏代替函数使之内嵌到程序里,进而避免了因反复调用函数而带来的保存、恢复现场的开支,使程序整体运行更快。本文后续讲述了两种避免编译器调用函数宏的方法。原创 2019-03-04 07:41:50 · 4451 阅读 · 0 评论 -
非标准C库怎么链接?
前言链接是代码生成可执行文件中一个非常重要的过程。我们在使用一些库函数时,有时候需要链接库,有时候又不需要,这是为什么呢?了解一些链接的基本过程,能够帮助我们在编译时解决一些疑难问题。比如,下面就有一种奇怪的现象。一个奇怪的链接问题程序功能很简单,计算e的n次方。程序清单如下(代码一):#include<stdio.h>#include<m...原创 2019-02-28 21:11:58 · 259 阅读 · 0 评论 -
C中如何自定义报错消息?
在C语言库中有一系列的库函数和变量使得我们在编程中更加方便的以自定义的格式输出存在系统调用期间发生的错误。其中strerror和error函数是最常用的错误报告类库函数;变量program_invocatoin_short_name可以使你更加便利的获取发生错误的程序名。1 char * strerror(int errnum)该函数声明在string.h中,参...原创 2019-03-05 10:35:32 · 1648 阅读 · 0 评论 -
详解C语言中内存分配函数
很多新学C语言的童鞋在用到动态内存分配的时候,对选择哪种分配函数及其有何区别搞不清楚,那么下文就认真的讲讲它们的种种。 (1)C语言的内存分配方式 从静态存储区域分配这些在程序编译的时候就已经分配好,且在程序的整个运行期间都固定不变。 使用这种方式分配内存空间的数据主要包括:代码段(DATA S...原创 2019-03-06 16:48:01 · 1863 阅读 · 0 评论 -
一文概括复杂度分析
复杂度分析法则:[单段代码看频率]:看代码片段中「循环代码」的时间复杂度。[多段代码看最大]:如果多个 for 循环,看「嵌套循环最多」的那段代码的时间复杂度。[嵌套代码求乘积]:循环、递归代码,将内外嵌套代码求乘积去时间复杂度。[多个规模求加法]:法有两个参数控制两个循环的次数,那么这时就取二者复杂度相加。-----------------------...原创 2019-03-05 07:38:47 · 153 阅读 · 0 评论 -
基础C语言知识串串香2☞char类型变量种种
文章参考微信公众号[嵌入式软件学习圈]char 类型变量种种1.使用char类型来执行字符处理大家应该都知道,C语言设计char类型的目的是存储字母和标点符号之类的字符。实际上, char类型存储的是整数而不是字符。为了处理字符,计算机使用一种数字编码的方式来操作,如常见的ASCII就是用特定整数来表示特定字符的。例如,要在ASCII码中存储字母B,实际上只需要...原创 2019-03-21 13:20:49 · 186 阅读 · 0 评论 -
typeof关键字
ANSI C定义了sizeof关键字,用来获取一个变量和数据类型在内存中所占的存储字节数。GNU 扩展了一个关键字,typeof用来获取一个变量或表达式的类型。int i;typeof(i) j = 20;typeof(int *) a;int f();typeof(f()) k;在上面的代码中,因为变量i的类型为int,所以typeof(i)就等于int,typeo...原创 2019-03-09 13:11:33 · 240 阅读 · 0 评论 -
基础C语言知识串串香11☞宏定义与预处理、函数和函数库
六、C语言宏定义与预处理、函数和函数库6.1、编译工具链源码.c->(预处理)->预处理过的.i文件->(编译)->汇编文件.S->(汇编)->目标文件.o->(链接)->elf可执行程序。预处理用预处理器,编译用编译器,汇编用汇编器,链接用链接器,这几个工具再加上其他一些额外的会用到的可用工具,合起来叫编译工具链。gcc就是一...原创 2019-04-01 23:48:13 · 316 阅读 · 0 评论 -
基础C语言知识串串香8☞指针精髓
三、指针精髓3.1 printf("%p\n");其中%p表示输出一个指针,就是指针变量(其存放的那个地址),可以理解为输出一个地址。3.2 int *p1, p2;等同于int *p1; int p2; int *p="Linux",其不能改变*P,因为”linux"是一个常数。3.3 (代码规范性)在定义指针时,同时赋值为NULL,在用指针时,先判断它...原创 2019-03-29 15:39:25 · 226 阅读 · 0 评论 -
基础C语言知识串串香3☞size_t类型
文章参考微信公众号[嵌入式软件学习圈]size_ t类型C语言标准规定size_t是一种无符号整数类型,编译器可以根据操作系统的不同而用typedef来定义不同的size_t类型,即在不同的操作系统上所定义的size_t 可能不一样。例如在32位操作系统上可以将size_t定义为unsigned int类型,而在64位操作系统上则可以定义为unsigned lo...原创 2019-03-23 08:50:53 · 223 阅读 · 0 评论 -
基础C语言知识串串香1☞基本数据类型
基本数据类型到C99目前为止,C语言为我们提供了12个相关的数据类型关键字来表达各种数据类型。如表所示,K&RC提供了7个,C891,C90 新増了2个,C99新増了3个。C的基本数据类型整型是C语言最基本的数据类型,它以二进制编码的方式进行存储,具体可以包括字符、短整型、整型和长整型等。例如,整数2的二进制表示为10,它在8位与32位的...原创 2019-03-22 09:34:49 · 208 阅读 · 0 评论