![](https://img-blog.csdnimg.cn/20190927151117521.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C语言编程
文章平均质量分 60
C语言
it潮人
这个作者很懒,什么都没留下…
展开
-
详解C语言volatile关键字(禁止编译器优化-原地址读取)
如果汇编指令修改了内存,但是GCC 本身却察觉不到,因为在输出部分没有描述,此时就需要在修改描述部分增加“memory”,告诉GCC 内存已经被修改,GCC 得知这个信息后,就会在这段指令之前,插入必要的指令将前面因为优化Cache 到寄存器中的变量值先写回内存,如果以后又要使用这些变量再重新读取。2)不要将变量缓存到寄存器,因为这段代码可能会用到内存变量,而这些内存变量会以不可预知的方式发生改变,因此GCC插入必要的代码先将缓存到寄存器的变量值写回内存,如果后面又访问这些变量,需要重新访问内存。转载 2024-03-04 16:07:17 · 338 阅读 · 0 评论 -
C语言技巧:有if时使用likely和unlikely让代码运行更快
但当x为非0时(比如100),!编译器在编译生成汇编代码时会在编译选项的引导下调整if分支内代码的位置,如果是likely修饰过的就调整到前面,如果是unlikely修饰过的就调整到后面。如果使用likely和unlikely来告诉编译器,哪个更加有可能发生,编译器将大概率执行的代码放在靠前的位置,就可以大大提高指令预取值的命中率,从而达到提升效率的目的。在单片机/嵌入式编程中,对速度要求比较高,likely和unlikely就是一个比较好的技巧,适用于有if-else分支,且知道哪个发生概率大的情况。转载 2024-02-01 19:47:27 · 223 阅读 · 0 评论 -
OpenWrt 系统UCI详解(Lua、C语言调用uci接口实例)
uci"是"UnifiedInterface”(统一配置界面)的缩写,用于OpenWrt整个系统的配置集中化。很多后台服务有自己的配置文件,并且配置文件格式都不相同,OpenWrt系统中需要开启各种服务,为了解决配置不兼容的问题,统一采用uci格式的配置文件。当然统一的前提是需要各个模块做好适配,所以要想把某个服务集成到OpenWrt系统中,需要增加一个转换层,用于uci配置到服务配置的转换,通常这个工作放在init脚本中处理。以samba服务器为例,转载 2024-01-14 22:09:37 · 1982 阅读 · 1 评论 -
C语言中的空宏定义
目录1、做标记,进行条件编译。2、做注释用,帮助理解3、占位符,用于不同平台移植看源代码中有如下宏定义:#define TYPEDEF与平常的宏定义有点不一样,于是查了下这种宏有什么用,总结如下:等价于“#define __TYPE_DEFINE__ do {} while (0)”上面代码输出:1.With Macro TYPE DEFINE如果注释掉“#define __TYPE_DEFINE__”,则输出变成:2.Without Macro TYPE DEFINE3、占位符,用于不同平台移转载 2024-01-09 11:30:59 · 173 阅读 · 0 评论 -
Linux内存调试工具初探-MEMWATCH
内存泄漏(即 malloc() 内存在对应的 free() 调用执行后永不被释放)和缓冲区溢出(例如对以前分配到某数组的内存进行写操作)是一些常见的问题,它们可能很难检测到。它使用C于处理器的功能,Memwatch使用它自己定义的功能函数取代所有在你的程序中用ANSI C定义的内存分配函数,Memwatch的内存分配函数包含了了所有的分配记录信息。清单 1 中的代码将分配两个 512 字节的内存块,然后指向第一个内存块的指针被设定为指向第二个内存块。结果,第二个内存块的地址丢失,从而产生了内存泄漏。转载 2024-01-03 14:56:16 · 181 阅读 · 0 评论 -
Memwatch简介
memwatch的输出文件名称为memwatch.log,而且在程序执行期间,所有错误提示都会显示在stdout上,如果memwatch未能写入以上文件,它会尝试写入memwatchNN.log,而NN介于01至99之间,若它仍未能写入memwatchNN.log,则会放弃写入文件。在三种检测工具当中,设置最简单的算是memwatch,和dmalloc一样,它能检测未释放的内存、同一段内存被释放多次、位址存取错误及不当使用未分配之内存区域。安装及使用memwatch。Memwatch使用注意。转载 2024-01-03 14:54:08 · 28 阅读 · 0 评论 -
c语言 利用联合和结构体将IP地址进行打印
在联合体内部将十进制数字存储起来,得到的是一个占有四个字节的整形,而最终要将每个字节用点隔开将每个字节中的二进制数字打印出来,形成我们所看见的形式。在联合体中,存储一个int整型和四个char类型时,只开辟四个字节的空间,而这时int和char其实是公用这四个字节的空间,char就是int,int就是char,所以通过ji将一个数存进int类型后,再将这个数以char类型能拿来,这时拿出来的就是每个字节的数了,然后又以10进制进行打印,让IP地址呈现在我们眼前。转载 2023-08-29 09:28:32 · 379 阅读 · 0 评论 -
define 与typedef的区别
define与typedef转载 2022-07-23 08:14:08 · 933 阅读 · 0 评论 -
#、##、__VA_ARGS__的使用
__VA_ARGS__的使用转载 2022-07-14 10:36:11 · 184 阅读 · 0 评论 -
C语言结构体初始化的几种方法
一、介绍结构体作为数据结构的基础,经常使用,其中初始化也有几种方法,这里详细介绍二、常规初始化(先定义再初始化)typedef struct { int bandrate; int databits; int stopbits; int parity; int dtr;}serial_hard_config_def;serial_hard_config_def serial;serial.bandrate = 115200;serial.datab转载 2022-05-06 15:51:27 · 21284 阅读 · 0 评论 -
print打印16进制时前面会多很多FF,解决办法。
最近在做一个3des软加密的项目,发现在C语言中用printf()函数打印字符型变量时,如果想采用"%x"的格式将字符型变量值以十六进制形式打印出来,会出现一个小问题,如下:char buf[10] = {0}; buf[0] = 0xbf; printf("%2x\n\n\n", buf[0]); /*在终端将会显示成:ffffffbf*/ buf[1] = 0x7f; printf("%2x\n\n\n", buf[1]); /*在...转载 2022-05-06 15:46:44 · 1994 阅读 · 0 评论 -
详解C语言中的stdin,stdout,stderr
我们在写C程序时经常遇到printf(),fprintf(),perror(),这些东西到底有什么作用。说到这不得不提及stdin,stdout,stderr。想想,我们在用C去写文件时的操作,File *fp=fopen(),这个fp就是我们向系统申请的,相当于一通往文件的通道。其实,stdin,stdout,stderr就是这个fp,不过他是随着计算机系统的开启默认打开的,其中0就是stdin,表示输入流,指从键盘输入,1代表stdout,2代表stderr,1,2默认是显示器。printf(.转载 2020-10-29 14:52:25 · 2509 阅读 · 0 评论 -
C语言stat()函数:获取文件状态
C语言stat(),fstat()函数:获取文件状态转载来源:http://see.xidian.edu.cn/cpp/html/326.html相关函数:fstat, lstat, chmod, chown, readlink, utime头文件:#include <sys/stat.h> #include <unistd.h>定义函数:int stat(const char * file_name, struct stat *buf);函数说明:stat(...转载 2020-10-10 15:18:05 · 501 阅读 · 0 评论 -
C语言“正则表达式”字符串处理sscanf(),使用前缀技巧、匹配邮箱等
一般的字符串处理函数可以使用C标准库的string.h,字符串匹配、字符串反转、在字符串中查找子串位置等。但string.h仍然满足不了我们的需求。来几个例题:(不允许使用c++)1、要求把一个字符串两端的空白符(可能有多个空格和TAB)给去掉,例如:“ asd123 qwer ”,要求处理完之后结果为:"asd123 qwer"。有人可能会想,这么简单的功能,手写一个函数就能轻松搞定,但是如果每来一个新需求都要手写一个新函数才能完成它,那就太累了,我们将使用C标准库来完成这个事情...转载 2020-10-10 15:14:55 · 1201 阅读 · 0 评论