C语言
文章平均质量分 76
C语言基础
houxiaoni01
这个作者很懒,什么都没留下…
展开
-
C语言:线程同步之信号量(sem_init,sem_post,sem_wait)
一、什么是信号量线程的信号量与进程间通信中使用的信号量的概念是一样,它是一种特殊的变量,它可以被增加或减少,但对其的关键访问被保证是原子操作。如果一个程序中有多个线程试图改变一个信号量的值,系统将保证所有的操作都将依次进行。而只有0和1两种取值的信号量叫做二进制信号量,在这里将重点介绍。而信号量一般常用于保护一段代码,使其每次只被一个执行线程运行。我们可以使用二进制信号量来完成这个工作。二、...转载 2019-11-29 19:10:42 · 14078 阅读 · 2 评论 -
C语言:static关键字的作用
static用法:在C中,static主要定义全局静态变量、定义局部静态变量、定义静态函数。1、定义全局静态变量在全局变量前面加上关键字static,该全局变量变成了全局静态变量。全局静态变量有以下特点。a. 在全局区分配内存。b. 如果没有初始化,其默认值为0。c. 该变量在本文件内从定义开始到文件结束可见。2、定义局部静态变量在局部变量前面加上关键字static,其特点如下...转载 2020-03-28 16:37:23 · 220 阅读 · 0 评论 -
C语言:二级指针(指向指针的指针)详解
摘自:《C语言入门》 http://c.biancheng.net/c/指针可以指向一份普通类型的数据,例如 int、double、char 等,也可以指向一份指针类型的数据,例如 int *、double *、char * 等。如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针。假设有一个 int 类型的变量 a,p1是指向 a 的指针变量,p2 又是指向 p1 的...转载 2019-12-17 16:35:15 · 559 阅读 · 0 评论 -
C语言:__attribute__(constructor)和__attribute__(destructor)
1、前言最近看代码,看到一个函数前面用__attribute__((constructor))修饰,搜了整个程序,没发现哪个地方调用这个函数。如下:__attribute__((constructor)) void load_file(){ printf("Constructor is called.\n"); g_count = (int *)malloc(sizeof(int));}2、__attribute__介绍__attribute__可以设置函数属性(Functio转载 2021-08-20 17:39:28 · 2069 阅读 · 2 评论 -
C语言:inline,static inline
inline函数被调用时,需要出栈入栈。当函数频繁被调用时,则不断地有函数出栈入栈,会造成栈空间或栈内存的大量消耗。所以引入了inline。inline: 在函数声明或定义中函数返回类型前加上关键字inline,即可以把函数指定为内联函数。内联函数: 建议编译器对一些特殊函数进行内联扩展(有时称作在线扩展)。也就是说建议编译器将指定的函数体插入并取代每一处调用该函数的地方(上下文),从而节省...转载 2020-02-19 11:59:44 · 11888 阅读 · 0 评论 -
C语言:mmap函数实现
1、认真分析mmap:是什么 为什么 怎么用:https://www.cnblogs.com/huxiao-tee/p/4660352.html2、Mmap系列一: Mmap的实现原理和应用(及与read/fread的比较):https://blog.csdn.net/don_chiang709/article/details/893322953、mmap 函数:原理与使用(含代码):https://www.jianshu.com/p/187eada7b9004、linux中mmap系统调用原理原创 2020-10-16 17:32:19 · 488 阅读 · 0 评论 -
C语言:堆和栈的区别是什么?
首先,讨论的堆和栈指的是内存中的“堆区”和“栈区”,OC语言是C语言的超集,所以先了解C语言的内存模型的内存管理会有很大的帮助。C语言的内存模型分为5个区:栈区、堆区、静态区、常量区、代码区。每个区存储的内容如下:1、栈区: 存放函数的参数值、局部变量等,由编译器自动分配和释放,通常在函数执行完后就释放了,其操作方式类似于数据结构中的栈。栈内存分配运算内置于CPU的指令集,效率很高,但是分配的内...转载 2019-12-17 16:22:58 · 677 阅读 · 0 评论 -
C语言:setjmp和longjmp函数使用详解
转载自: https://www.runoob.com/cprogramming/c-standard-library-setjmp-h.html https://blog.csdn.net/chenyiming_1990/article/details/86834131、C 标准库 - <setjmp.h>简介setjmp.h 头文件定义了宏 setjmp()、函数 ...转载 2019-01-10 10:01:09 · 4451 阅读 · 0 评论 -
C语言:堆栈溢出一般是由什么原因导致的?
1、函数调用层次太深。函数递归调用时,系统要在栈中不断保存函数调用时的现场和产生的变量,如果递归调用太深,就会造成栈溢出,这时递归无法返回。再有,当函数调用层次过深时也可能导致栈无法容纳这些调用的返回地址而造成栈溢出。2、动态申请空间使用之后没有释放。由于C语言中没有垃圾资源自动回收机制,因此,需要程序主动释放已经不再使用的动态地址空间。申请的动态空间使用的是堆空间,动态空间使用不会造成堆溢...转载 2019-11-29 18:48:05 · 5204 阅读 · 0 评论 -
C语言:修改系统时间,导致sem_timedwait 一直阻塞的问题解决和分析
修改系统时间,导致sem_timedwait 一直阻塞的问题解决和分析原创 2021-05-31 18:43:45 · 1910 阅读 · 0 评论 -
C语言:volatile关键字的作用
一、前言1、编译器优化介绍由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度。以上是硬件级别的优化。再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化。编译器优化常用的方法有:将内...转载 2020-03-28 18:04:14 · 1330 阅读 · 0 评论 -
使用C语言查看一个文件夹中所有文件及目录
1.前言1.1声明文章中的文字可能存在语法错语以及标点错误,请谅解;如果在文章中发现代码错误或其它问题请告知,感谢!2.实现方法为了使用C语言实现查看一个文件夹中的文件数量功能,可以使用dirent库,该库文件包含的许多UNIX系统服务的函数原型,例如opendir函数、readdir函数,可以实现查看目录中文件数量等功能。2.1dirent中常用数据类型以及函数功能简介下面对dirent中常用的数据类型以及函数进行简单的解释:常用结构体:DIR结构体:struct __dirstrea转载 2021-02-05 14:20:36 · 4964 阅读 · 0 评论 -
C语言:断言assert函数完全攻略
对于断言,相信大家都不陌生,大多数编程语言也都有断言这一特性。简单地讲,断言就是对某种假设条件进行检查。 在 C 语言中,断言被定义为宏的形式(assert(expression)),而不是函数,其原型定义在 <assert.h> 文件中。其中,assert 将通过检查表达式 expression 的值来决定是否需要终止执行程序。也就是说,如果表达式 expression 的值为假(即...转载 2019-12-19 14:11:51 · 15633 阅读 · 6 评论 -
C语言:命令行选项解析函数---getopt()和getopt_long()
上午在看源码项目 webbench 时,刚开始就被一个似乎挺陌生函数 getopt_long() 给卡住了,说实话这函数没怎么见过,自然不知道这哥们是干什么的。于是乎百度了一番,原来是处理命令行选项参数的,的确,正规点的大型程序一般第一步就是处理命令行参数的,接着才是主干程序。在百度和 man 的帮助下,找到了具体使用方法和解释,二话不说赶紧学习一下,并总结出文档记录一下。平时在写程序时常常需要...转载 2019-12-19 16:20:51 · 982 阅读 · 0 评论 -
C语言:ioremap函数
一、 ioremap() 函数基础概念几乎每一种外设都是通过读写设备上的相关寄存器来进行的,通常包括控制寄存器、状态寄存器和数据寄存器三大类,外设的寄存器通常被连续地编址。根据CPU体系结构的不同,CPU对IO端口的编址方式有两种:I/O 映射方式(I/O-mapped)典型地,如X86处理器为外设专门实现了一个单独的地址空间,称为"I/O地址空间"或者"I/O端口空间",CPU通过专门的I/O指令(如X86的IN和OUT指令)来访问这一空间中的地址单元。内存映射方式(Memory-mapp转载 2021-11-22 11:43:46 · 780 阅读 · 0 评论