C核心技术--提高篇
一个工作近十年的码农,对自己的C做系统性总结和记录。
一直在学习而从未总结,从现在结合自己遇到过的实际问题,每周总结1~7篇C开发知识。
baowxz
一日不读书,无人看的出;一周不读书,开始会动粗;一月不读书,笨的像头猪。
展开
-
位域相关知识
有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。例如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位。正是基于这种考虑,C语言又提供了一种叫做位域的数据结构。转载 2022-11-23 09:19:02 · 150 阅读 · 0 评论 -
fscanf读内容后发生错误,文件指针变成乱码(野指针)
fscanf出问题,fscanf无法继续读,无法fclose原创 2022-03-30 17:15:28 · 1666 阅读 · 1 评论 -
如何在不同c文件中强制跳转-- setjmp 和 longjmp 的使用
setjmp和longjmp和goto一样,尽量避免用。一般goto只能在本地c文件使用,setjmp和longjmp可以在整个程序中使用,具体介绍用法如下:首先需要包含头文件#include 一、setjmp 1、setjmp( jump_buf j )必须首先被调用,它表示“使用变量j记录现在的位置,函数返回零”; 二、longjmp longjmp( jump_buf j, int i )可以接着被调用。它表示“回到 j 所记录的位置,让它看上起像是从原先的setjmp() 函...原创 2022-03-23 09:49:23 · 586 阅读 · 1 评论 -
1.11 指向void的指针(void *形式的指针)
1、void *指针,是指向void的指针,他是个通用指针2、任何对象指针类型都可以隐式地转换成 void指针,反之亦然; 这个特性很有用,特别是在大型工程分层设计时,一定会用到,通常来定义外部接口。...原创 2021-09-16 15:46:29 · 241 阅读 · 0 评论 -
1.10 关于数据转换
数据的转换可以通过指针的方式来进行不同类型的数据类型转换,如下:float uint32tofloat(uint32 idata){ return *((float *)(&idata));}uint32 floattouint32(float idata){ return *((uint32 *)(&idata));}可以将float类型数据,转换为u32的格式或者16进制的格式存储;在有些场合处理很方便。...原创 2021-09-16 14:21:36 · 102 阅读 · 0 评论 -
1.9 关于字符串需要注意的地方
1、字符串的修改1.1 有可能会有以下代码:char *p=“house”; //初始化一个字符串指针*p=‘m’; //修改字符串内容上述第二句,很不建议这么做,因为上述语句不具有可移植性;原因之一:定义的字符串,一般编译器会认为它是个常量,可能会将它分配到只读存储区了;原因之二:如果别的地方也定义了这个字符串常量,则编译器会将这两个常量分配到同一个区域,而修改一个区域的值可能会影响其他的字符串定义值;1.2 所以一般建议这么写c...原创 2021-08-24 18:05:18 · 102 阅读 · 0 评论 -
1.8 关于常量需要注意的地方
1、写代码是可能有时候打字过快,会将代码前常量数字前面多打了个0,然后引发数据赋值错误,如下: int i = 020; printf("i am =%d\r\n",i);如果没注意的话,程序不会有任何警告,但是此时i的值=16因为数字前面多打了个0,程序会认为是表示的八进制(八进制实际中很少用到)的数。这样,程序运行运行着就发生错误了,有时找半天都找不着哪里出现了问题,所以要注意。...原创 2021-08-23 23:14:22 · 74 阅读 · 0 评论 -
1.7关于负数的处理
1、一下代码char a=-128;if(a<0) a=-a;所以a的值会为多少?a依然为-128;2、此函数延伸void doSetData(char setdata, char desdata){ xxx; xxx; if(setdata<0) setdata=-setdata; desdata=setdata;}desdata会产生一个异常行为,状态未知。上述两个函数逻辑都会产生bug...原创 2021-08-18 22:13:22 · 1991 阅读 · 0 评论 -
1.6 关于变量需要注意的地方
1、起源今天看到一篇文章介绍说,我们定义的变量/标识符的长度是有限制的:C编制是没限制,但是大部分编译器只识别/认定“有限个数的字符”是有效的,就是说,如果两个变量都很长的名字,前面的 “有限个数的字符”一样,编译器可能就没法区分这两个表示符哦。这时可能就产生bug,而且一般人估计你问题都找不出来。o(╯□╰)o2、约定为了符合C标准,大部分编译器将函数和全局变量名称前面至少31位视为有效字符;其他的标识符至少63个。3、思考以前还真没思考这个问题,所以 1>我们平时定义.原创 2021-08-17 15:17:07 · 220 阅读 · 0 评论 -
1.5 关于调试需要注意的地方
1、调试的话,有很多手段,在实验室研发阶段大多使用在线调试/仿真手段2、在实际场景工作中,在线调试和仿真时不可取的,所以大家尽量摈弃依赖在线调试的方式跑数据和调试代码。因为我们开发产品交付给客户时,大部分产品知识客户产品一部分,客户不可能让你去现场拆自己的产品/设备让你去在线仿真。你只能做的是远程抓数据。3、远程调试,就是打印log,这就不得不提几个宏定义了 __func__ 函数名 __LINE__行数 __TIME__时间 __DATE__日期...原创 2021-08-17 14:47:25 · 263 阅读 · 0 评论 -
1.4 关于关键字需要注意的地方
1、C语言标准的关键字有如下37个,如下:2、我想说的是注意一个关键字“data”,在有些软件/编译器里,data可能是个预定义的关键词,好多人可能会写出下面的函数:void doSenddata(uchar *data,uchar len){}这样子,那个data在有的软件编译时会产生个错误,主要的是你找了半天还没发现啥错误和问题。所以此时要注意,d疼!所以在定义函数时,传递参数的名字最好不要用这个单词!!...原创 2021-08-17 14:26:36 · 89 阅读 · 0 评论 -
1.3 关于注释需要注意的地方
1、C本身标准注释是/*....*/2、C99才有//,这个单行注释,但是这个单行注释在C99未发布前就被很多编译器已经支持了,所以可以放心用3、想说的是还可以这样注释:采用预编译的方式,#if 0 ......要屏蔽的内容 #endif可以很方便的打开/关闭需要控制的内容...原创 2021-08-17 13:44:04 · 98 阅读 · 0 评论 -
1.2 关于编译器需要注意的地方
1、C的编译器从支持C99开始(或者支持C99部分特性)才支持代码中间定义变量,才开始支持 进行结构体的方便初始化的方式:.结构体成员=初始化值struct InitMember{ int first; double second; char* third; float four;};struct InitMember test = { .second = 3.141590, .third = "method three", // .fi...原创 2021-08-16 23:56:07 · 93 阅读 · 0 评论 -
第一章,第一篇,第一小节
这个是我自己记录自己的总结。闻道有先后,术业有专攻。每个写代码的,都会遇到的属于自己的坑,同时也属与大家的坑。闻道有先后,大部分坑 ,大家都会遇到,只是时间早晚问题( ▼-▼ )。不过,遇到坑时,莫慌,要向下面这样子1、第一点当然要自信啦,相信自己可以解决问题的。好了完了。...原创 2021-08-16 23:36:52 · 67 阅读 · 0 评论