
C
嵌入式Linux,
BSP软件工程师
展开
-
memcpy执行效率测试,无效测试
#include <stdio.h>#include<time.h>#include<math.h>#include <unistd.h>clock_t start,stop;//clock_t是clock()函数返回的变量类型double duration;//记录被测试函数运行时间,以秒为单位#define MAXK 1e7/*被测函数最大重复调用次数*/void computationtime(double start,doubl原创 2021-04-19 13:59:45 · 578 阅读 · 0 评论 -
stdout字符串过滤输出
功能把stdout的内容重定向到一个文件,然后从文件里面读取数据,再把数据对应的字符串给过滤掉,重新输出到stdout中代码// gcc xx.c -lpthread && ./a.out#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <fcntl.h>#include <sys/types.h>#include <sys/s原创 2021-02-25 18:08:37 · 694 阅读 · 0 评论 -
计算最后一个单词的字符串长度
题目http://www.nowcoder.com/questionTerminal/8c949ea5f36f422594b306a2300315da看了大家的答案,觉得还是稍微复杂。给一个比骄简单的解题思路。只要是空格,就把计数置0,要不然就一直自增。#include "stdio.h"#include "string.h"int main(){ char str1[101]; fgets(str1,sizeof(str1),stdin); int len,i,co原创 2021-02-07 15:14:18 · 412 阅读 · 3 评论 -
C语言单链表实现栈
#include "stdio.h"#include "stdlib.h"struct List{ int data; struct List * next;}; struct Stack{ struct List *head; int size;};struct Stack * StackInit(void){ struct Stack *stack = NULL...原创 2019-10-29 11:18:10 · 1437 阅读 · 1 评论 -
C语言-数组a 和&a 的区别
面试经典题目#include "stdio.h"int main(){ int a[5] = { 1,2,3,4,5 }; int *ptr = (int *)(&a + 1); printf("%d,%d", *(a + 1), *(ptr - 1)); /*getchar是用VS编写方便查看输出*/ getchar(); return 0;} 请思考...原创 2018-12-20 15:35:25 · 1794 阅读 · 0 评论 -
C语言关键字(三)
之前的两篇文章嵌入式Linux:c语言深度解剖(数据类型关键字)zhuanlan.zhihu.com嵌入式Linux:c语言深度解剖(入门篇)zhuanlan.zhihu.com这篇文件继续讲解C语言关键字想问大家一个问题,什么是声明什么是定义?举个例子:A)int i;B)extern int i;(关于 extern,后面解释)哪个是定义?哪个是声明?或者都...原创 2018-11-01 10:19:20 · 2342 阅读 · 0 评论 -
嵌入式软件面试(基础题)总结,不断更新
C/C++/各种基础啊1. static有什么用途?(请至少说明两种)1.限制变量的作用域2.设置变量的存储域2. 引用与指针有什么区别?1) 引用必须被初始化,指针不必。2) 引用初始化以后不能被改变,指针可以改变所指的对象。2) 不存在指向空值的引用,但是存在指向空值的指针。3. 描述实时系统的基本特性在特定时间内完成特定的任务,实时性与可靠性4. 全局...原创 2018-10-23 17:34:21 · 5065 阅读 · 0 评论 -
printf 宏 调试技巧
1 前言printf调试是嵌入式调试的基本手段,而且是非常重要的手段,我认为相比单步调试更加有用有效,特别是单片机之后跑系统,单步调试效率更加低下了,我们在工作遇到bug的时候,我们第一时间就想知道那些该死的日志有没有保存下来,这样好让我们程序员装逼一波把问题解决。printf宏定义调试非常重要,有些日志在开发的时候才需要打开,发布的时候需要关闭,但是在代码上又需要保留下次调试,所以我们在...原创 2018-10-10 08:43:10 · 2340 阅读 · 0 评论 -
我的师傅是风清扬
1 珍惜那些处处帮助你的人国庆假期就要过去了,国庆这几天一直在考虑一个问题(先保留是什么问题),也咨询了几个比较信任的朋友,都没有得到肯定的答案。回家路上跟了一个大哥哥(陈哥),是我小舅子的朋友,在2003年就开始来深圳打拼,用他的话说,当时穿着一双拖鞋来深圳,现在搞了一个小厂子,虽然没有出人头地,但是也没亏掉什么 ,说话中带着惋惜和骄傲。陈哥从30号认识到5号回到深圳,我们接触...原创 2018-10-09 14:12:37 · 1380 阅读 · 0 评论 -
## __VA_ARGS__ ... 宏和可变参数
在GNU C中,宏可以接受可变数目的参数,就象函数一样,例如: 1 2 #define pr_debug(fmt,arg...) \ printk(KERN_DEBUG fmt, ##arg) 用可变参数宏(variadic macros)传递可变参数表 你可能很熟悉在函数中使用可变参数表,如: 1 ...转载 2018-10-06 00:31:11 · 856 阅读 · 0 评论 -
gcc c语言编译流程
1前言 最近群里讨论个C语言的小程序,看起来都不是很难,但是大家对答案有争论,所以想讨论编译原理,做嵌入式要对编译原理有一定的了解,所以转了这篇文章。我们之前讨论的问题如下代码#include #include #define WEIQIFA 0;int main(void) { int i = WEIQIFA; ...原创 2018-09-13 12:13:50 · 1540 阅读 · 0 评论 -
Bootloader传参数到Kernel
01 前言这几天一直在考虑准备写点什么东西,本来想介绍下文件系统,不过文件系统是概念性的东西比较多,我自己也是看书摘抄的多,Bootloader传参数到Kernel,这个在我们开发中会经常遇到。bootloader有什么用?我突然想到,小时候去河里炸鱼,我们要自制鱼雷,把烟花里面的火药拆出来放到一个玻璃瓶里面,然后接上雷管露在外面,用泥封住瓶口,再用一些饭来吸引鱼,当我们看...原创 2018-09-03 17:22:26 · 1429 阅读 · 0 评论 -
C指针-这该死的嵌入式学习生涯
01 前言 最近在公众号里面收到好几个同学关于嵌入式方面的咨询,再加上在知乎里面陆续推送了好几个嵌入式学习入门的问题,这次想统一整理一下,说说我这些年是如何被嵌入式按在地上摩擦的。 1、那一年夏天 2008年的夏天,我记得很清楚,我和XH坐在电脑前两眼迷茫填报我们的高考志愿,我们当时没有当多的选择,说实话,我不知道以后想做什么,想从事哪方面的工...原创 2018-08-25 09:44:25 · 2624 阅读 · 3 评论 -
C 实现 删除字符串空白符的函数 strtrim
说在前面的话字符串操作在很多C语言比赛里面都有涉及,最近公众号里面的C语言比赛,都是两个关于字符串操作的题目,希望大家认真看题目。直接上代码/************************************************************************* &gt; File Name: trim.c &gt; Author: &gt; Mail: ...原创 2018-11-12 16:05:04 · 2364 阅读 · 0 评论 -
第一届 C语言比赛
https://zhuanlan.zhihu.com/p/49116229This English game is a simple English words connection game.The rules are as follows: there are N English words in a dictionary, and every word has its own wei...原创 2018-11-12 17:07:07 · 651 阅读 · 0 评论 -
Unicode 和 UTF-8 有什么区别?
作者:uuspider链接:https://www.zhihu.com/question/23374078/answer/65352538来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 举一个例子:It's 知乎日报你看到的unicode字符集是这样的编码表:I 0049t 0074' 0027s 0073 0020知 77e5乎...转载 2018-11-15 10:25:54 · 434 阅读 · 0 评论 -
用单链表实现一个队列
直接写代码吧直接一些#include<stdio.h>#include<stdlib.h>typedef int ElementType; /*队列元素类型*/#define SUCCESS 0#define FAILURE -1/*定义队列结构*/typedef struct StackInfo{ ElementType value; /*队列存...原创 2019-10-11 14:51:06 · 805 阅读 · 0 评论 -
用链表实现一个栈
#include<stdio.h>#include<stdlib.h>typedef int ElementType; /*栈元素类型*/#define SUCCESS 0#define FAILURE -1/*定义栈结构*/typedef struct StackInfo{ ElementType value; /*栈存储的数据*/ stru...原创 2019-10-07 23:30:32 · 637 阅读 · 0 评论 -
用数组实现一个栈
#include<stdio.h>#define STACK_SIZE 64 /*栈大小*/#define TOP_OF_STACK -1 /*栈顶位置*/typedef int ElementType; /*栈元素类型*/#define SUCCESS 0#define FAILURE -1/*定义栈结构*/typedef struct StackInfo{ ...原创 2019-10-07 21:54:49 · 729 阅读 · 0 评论 -
浪漫情人节|C语言画心型
1.前言新年第一天上班,先祝大家新年快乐,巧的是,今天刚好又是情人节,所以想了下用C实现画心形符号~2.心形符号数学公式http://mathworld.wolfram.com/HeartCurve.html这个网站里面的公式,我随便挑了一个公式如下(x2+y2−1)3−x2y3=0 (x^2+y^2-1)^3 - x^2y^3 = 0 (x2+y2−1)3−x2y3=03.代码如...原创 2019-02-14 11:52:43 · 2997 阅读 · 2 评论 -
container_of实例
1 前面说的container_of 在linux内核代码里面使用非常多,对于喜欢linux编程的同学来说,对这个函数要非常清楚他的使用方法,而且还要知道他的原理,这对以后看内核代码,写内核驱动的帮助都非常大,当然,我不是说了解这个就可以为所欲为了,内核博大精深,先宏观再微观去学习,不要想着一口就能吃成一个胖子,我这篇文章主要剖析一下这个函数的实现原理,希望对大家学习过程中有所帮助。 ...原创 2019-01-14 17:29:50 · 832 阅读 · 1 评论 -
linux 内核宏container_of剖析
1、前面说的我在好几年前读linux 驱动代码的时候看到这个宏,百度了好久,知道怎么用了,但是对实现过程和原理还是一知半解。container_of宏 在linux内核代码里面使用次数非常非常多,对于喜欢linux编程的同学来说,了解其实现方法,对以后看内核代码,写内核驱动的帮助都非常大,当然,我不是说了解这个就可以为所欲为了,内核博大精深,先宏观再微观去学习,不积跬步何以致千里,不要想着...原创 2019-01-17 16:23:25 · 568 阅读 · 0 评论 -
老王带你理解算法复杂度O(1),O(N),O(N^2)
上图对应的是算法复杂度的图片,X轴对应的是n(问题规模),Y轴对应的是执行的运行时间。 我们先从简单的复杂度解读O(1)从上面的图片我们可以看到O(1)的复杂度是恒定的,一点波澜都没有,什么是O(1)呢,就比如你是一个酒店的管理员,你负责管理酒店的钥匙,你很聪明,你把酒店的100把钥匙放在了100个格子里面存着,并且把格子从1~100进行了编号,有一天有客人来了,酒店老板说,给我拿...原创 2018-12-17 11:12:20 · 1485 阅读 · 0 评论 -
C/C++函数指针与指针函数
前面说的话面试的时候,经常有面试官问这个问题,在Linux内核里面也是经常被使用的,在看很多大神的代码里面,我们也经常遇到函数指针与指针函数,一样,如果你自己没问题了,就不用往下看了。 定义我们看个代码int *func(int a,int b)我们之前说过运算符的优先级,*的优先级低于(由于“*”的优先级低于“()”的优先级,因而func首先和后面的“()”结合,...原创 2018-12-20 15:39:02 · 3199 阅读 · 0 评论 -
C语言测试n的阶乘和x的n次方
题目描述输入一个正数x和一个正整数n,求下列算式的值。要求定义两个调用函数:fact(n)计算n的阶乘;mypow(x,n)计算x的n次幂(即xn),两个函数的返回值类型是double。 ×输出保留4位小数。输入x n输出数列和样例输入2.0 3样例输出1.3333 答案/****************************************...原创 2018-12-12 16:54:48 · 6386 阅读 · 0 评论 -
变量命名
为了代码清晰易懂,通常变量名采用一些著名的命名规则,主要有Camel标记法,Pastal标记法和匈牙利标记法。 Camel标记法采用首字母小写,接下来的单词都以大写字母开头的方法,如myName。 Pastal标记法采用首字母大写,接下来的单词都以大写字母开头的方法,如MyName。 匈牙利标记法是在Pastal标记法的基础上,变量名前面加上一转载 2017-12-11 13:50:13 · 798 阅读 · 0 评论 -
函数指针
#include "stdio.h"void function_test(void){ printf("function_test\r\n");}void main(void){ int a=0; int b=1; int c=2; int d=3; void (*p)(void); p = &function_test; (*p)(); a原创 2017-03-09 19:13:23 · 565 阅读 · 0 评论 -
字符串逆序排列
#include #include #include int main(void){ char *src=NULL; int len=0; char * dest=NULL; char * d =NULL; char * s =NULL; src = (char*)malloc(20); printf("**********************************原创 2014-03-07 15:36:25 · 2200 阅读 · 0 评论 -
函数指针
例1:#include int (*ptr)(void);int max(void){ printf("max\n"); return 10;}void main(void){ ptr=max; printf("max=%d\n",(*ptr)()); printf("hello world!\n");}例2:#include int max(i原创 2014-03-13 18:22:26 · 845 阅读 · 0 评论 -
把输入字符的小写转换成大写并输出
#include #include #include /********************************把小写字母转成大写字母********************************/int main(void){ char *src=NULL; unsigned char i=0; char *new_1=NULL; char *new_2=NUL原创 2014-03-08 09:25:38 · 3924 阅读 · 0 评论 -
C结构体指针(和老农交流的)
#include "stdio.h"#include #include struct student{ int num; char *name; struct student *next;};int main(void){ struct student a,b,c,*head,*p; a.name = "li原创 2014-03-12 18:05:27 · 974 阅读 · 0 评论 -
C两个小例子(数组与指针)
c语言指针和数组和大小端模式的应用原创 2014-03-11 11:46:24 · 1304 阅读 · 2 评论 -
c语言简单的链表
#include"stdio.h"#include"stdlib.h"struct linkwqf{ int age; char * name; struct linkwqf* next;};typedef struct linkwqf linkwww;linkwww *head=NULL;linkwww *tail=NULL;linkwww * InitLink(vo原创 2013-08-25 22:10:40 · 1061 阅读 · 0 评论 -
结构体中.和->的用法
#include"stdio.h"#include"stdlib.h"struct linkwqf{ int age; char * name; struct linkwqf* next;};struct linkwqf linkwww1;/*第一种声明结构体类型变量的方法 这种方法意义不大*/typedef struct linkwqf linkwww2;/*第一种声明结构原创 2013-08-26 09:55:17 · 6231 阅读 · 0 评论 -
微软笔试题(看到的写答案啊)
int func(int n, int* r){ return n && (*r += n) && func(n-1, r);}int main(){ int r = 0; func(100, &r); return 0;}原创 2013-08-21 21:11:08 · 1032 阅读 · 0 评论 -
嵌入式工程师应该知道的C语言
收集的一些嵌入式软件工程师面试题目 1、将一个字符串逆序 2、将一个链表逆序 3、计算一个字节里(byte)里面有多少bit被置1 4、搜索给定的字节(byte) 5、在一个字符串中找到可能的最长的子字符串 6、字符串转换为整数 7、整数转换为字符串转载 2013-05-31 12:09:53 · 9332 阅读 · 0 评论 -
这段程序还搞错一个输出(写在这里提醒自己)
#include "stdio.h"void Func(char strln[100]){ char str[]="Hello World"; char *p = str; int n = 10; void *p1 = malloc(100); printf("size1 = [%d]\n",sizeof(str)); printf("size2 = [%d]\n",si原创 2013-05-21 18:21:35 · 907 阅读 · 0 评论 -
指针的基本操作(10.1 Basic Pointer Operations)
c指针翻译 请指正翻译 2014-03-10 17:31:17 · 1641 阅读 · 0 评论 -
编译器的大小端模式
大端模式(Big_endian):字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。小端模式(Little_endian):字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。union型数据所占的空间等于其最大的成员所占的空间。对union型的成员的存取都是相对于该联合体基地址的偏移量为0处开始,也就是联合体的访问不论对哪个变量的存取都是从uni原创 2014-04-29 14:23:52 · 5406 阅读 · 0 评论 -
数组和指针
#include#include#includevoid main(void){ int a[5] = {1,2,3,4,5}; int *ptr=(int *)(&a+1); printf("%d,%d\n",*(&a+1-1),*(ptr-1));}原创 2014-04-29 13:53:52 · 998 阅读 · 0 评论