
C/C++
文章平均质量分 74
编程语言
川渝小神丢
独立思考!
展开
-
gets与scanf与EOF
一、gets(str)1.从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为‘\0’空字符,并由此来结束字符串。2. 返回值,如果读入成功,返回与str相同的指针,如果遇到错误或EOF则返回NULL3.gets不是安全函数,在linux下fgets才是安全的函数二、scanf()1. 函数返回成功读入的数据项数,读入数据时,如果遇到错误或遇到end of file,返回值...原创 2021-03-02 21:55:33 · 1902 阅读 · 0 评论 -
C开发经验
1.IAR中,函数指针参数如果为void,那么定义函数指针和函数实体时也要写上void,否则编译会报错。2.对多个源文件,如果a文件要访问b文件的函数指针而调用b文件中的函数,前提是b文件的这个函数指针在b调用之前,要在a中定义和声明,否则会出现系统卡死的问题,因为调用一个未初始化的函数指针,系统不知道掉到哪里去了。也有个办法就是调用的时候判断是否为NULL。 还有就是在定义结构...原创 2020-04-24 17:00:22 · 724 阅读 · 0 评论 -
除法、求余和取模的区别
C中经常遇到不同平台代码移植,移植过程中,不同语言或不同平台对除法、求余和取模处理是有区别的,这里找了一篇比较清晰的介绍除法、求余和取模的区别文章。一、除法运算符"/"二元运算符,具有左结合性。参与运算的量均为整型时,结果为整型,舍去小数。如果运算量中有一个为实型,结果为双精度实型。例如:5/2=2,1/2=05/2.0=2.5二、取余、取模运算符"%"通常情况下取模运...转载 2020-03-27 14:42:47 · 4168 阅读 · 0 评论 -
typedef和define的区别,const的使用
(1)#define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不管含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错;而typedef是在编译时处理的。它在自己的作用域内给一个已经存在的类型一个别名。 (2)typedef int * ptr与#define ptr int *的区别:作用都是用ptr代表int * ,但是二者不同...原创 2020-03-21 16:59:37 · 189 阅读 · 0 评论 -
Linux中select函数及实例
Unix中的函数select和poll用来,支持Unix中I/O复用的功能,在Unix中I/O模型可以分为以一几种:(1)阻塞I/O(2)非阻塞I/O(3)I/O复用(select和poll)(4)信号驱动I/O(SIGIO)(5)异步I/O 其中,现在比较流行的I/O模型是阻塞I/O模型.阻塞I/O是当应用程序和内核交换数据时,由于内核还没有准备好数转载 2017-11-27 15:07:05 · 11831 阅读 · 0 评论 -
C中的双引号与单引号
1. ’ ’ 引起的一个字符代表一个整数,整数值对应于该字符在编译器采用的字符集中的序列值; ” ”引起的字符串代表的是一个指向无名数组起始字符的指针。2. 用" "引起来的是字符串,在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。字符串总是 以'\0'作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符 '\0'存原创 2017-11-24 10:10:01 · 6163 阅读 · 1 评论 -
指针数组与数组指针
一、 区别数组指针(也称行指针)定义 int (*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。如要将二维数组赋给一指针,应这样赋值:int a[3][4];int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p转载 2017-12-09 16:51:30 · 497 阅读 · 0 评论 -
生命周期,作用域的定义;说明全局变量、静态变量、局部变量、const变量的生命周期、作用域
生命周期,作用域的定义;说明全局变量、静态变量、局部变量、const变量的生命周期、作用域:生命周期:是一个变量存在的周期。作用域:是一个变量可以被引用的范围。最常见的如:{}、static修饰符等等。1)全局变量:作用域:全局作用域(只需要在一个源文件中定义,就可以作用于所有的源文件);生命周期:程序运行期一直存在;引用方法:其他文件如果要使用,必转载 2017-09-15 09:55:34 · 724 阅读 · 0 评论 -
可重入与线程安全
一、可重入函数满足两个条件: 1. 函数是线程安全的 2. 函数是可软中断的。即执行了软中断处理例程后,再回过头来继续执行函数,结果仍然正确。二、可重入和线程安全函数特性1. 如果一个函数中用到一个全局或静态变量,那么它不是线程安全的,也不是可重入的。2. 如果加以改进,在访问全局或静态变量时使用互斥量或信号量等方式加锁,则使它变为线程安原创 2017-09-05 15:35:59 · 391 阅读 · 0 评论 -
段错误原因分析和查找
http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html1. 段错误是什么一句话来说,段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址、访问了系统保护的内存地址、访问了只读的内存地址等等情况。这里贴一个对于“段错误”的准确定义(参考Answers.com):转载 2015-06-04 15:43:47 · 761 阅读 · 0 评论 -
C++中的namespace
对于一个存在着标准输入输出的C++控制台程序,一般会在#include 的下一行发现一句话,using namespace std。这句话其实就表示了所有的标准库函数都在标准命名空间std中进行了定义。其作用就在于避免发生重命名的问题。1. 关于namespace C++引入了命名空间namespace主要解决了多个程序员在编写同一个项目中可能出现的函数等重名的现象。解决方法就是加上自己转载 2015-04-02 16:26:03 · 319 阅读 · 0 评论 -
C中的volatile关键字
一、定义 就像const一样,volatile是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。如果没有volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。二、作用volatile的作用是: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值转载 2015-03-19 10:04:57 · 335 阅读 · 0 评论 -
c源代码检查工具splint使用问题及方案
splint使用时,可以使用splint -help查看需要帮助的项目,然后针对需要了解的项目可以splint -help [项目]查看具体的帮助。 在splint使用过程中,老是出现Parse Error,下面是问题可能解决的方案:1.splint将检查给定c源文件Simple.c的所有依赖关系。比如Simple.c包含或间接包含的头文件。2.为了知道Simple.c间接原创 2015-01-04 12:37:00 · 4388 阅读 · 0 评论 -
代码静态分析工具——splint的学习与使用(转)
引言 最近在项目中使用了静态程序分析工具PC-Lint,体会到它在项目实施中带给开发人员的方便。PC-Lint是一款针对C/C++语言、windows平台的静态分析工具,FlexeLint是针对其他平台的PC-Lint版本。由于PC-Lint/FlexeLint是商业的程序分析工具,不便于大家对其进行学习和使用,因而下面我将介绍一个针对C语言的开源程序静态分析工具——splint。转载 2015-01-03 21:25:40 · 635 阅读 · 0 评论 -
打印程序中调用者与被调用者的关系--cflow
cflow程序会输出一个函数调用树,它是一个显示函数调用关系的图表。在fedora20-x86环境下安装软件包 cflow.i686.0.1.4-5.fc20,即1.4版本。用法: cflow [选项...] [文件]... 如cflow test.c就会打印出test.c中的函数调用关系,注意是整个程序的函数调用关系。原创 2014-12-30 10:36:52 · 759 阅读 · 0 评论 -
C程序美化器
Fedora20-X86环境下indent工具,下面简单介绍此工具的使用方法:使用的indent参数值含义--blank-lines-after-declarationsbad变量声明后加空行--blank-lines-after-proceduresbap函数结束后加空行原创 2014-12-30 10:27:14 · 400 阅读 · 0 评论 -
关于联合体
一、联合体 联合体的每个成员共享一块内存,这块内存的大小就是联合体占用内存的大小。这块内存至少有其中占用内存最大成员的大小,有时候大于是因为有时候要考虑内存对齐。二、联合体的作用1. 可以判断平台属于大端存储还是小端存储2. 共享内存(进程间通信)的时候可以使用3. 在通信程序中,有时候要发送浮点型数据,为了方便操作,可以定一个联合体,联合体的一个成员为浮点数,原创 2016-05-12 22:32:08 · 630 阅读 · 0 评论 -
函数指针和回调函数
C++很多类库都用回调函数,比如MFC中的定时器,消息机制,hook机制等。回调函数与QT中的信号-槽机制很像,但回调更快,而信号-槽更灵活。1. 回调函数什么是回调函数呢?回调函数其实就是一个通过函数指针调用的函数!假如你把A函数的指针当作参数传给B函数,然后在B函数中通过A函数传进来的这个指针调用A函数,那么这就是回调机制。A函数就是回调函数,而通常情况下,A函数是系统在符合你设定条件转载 2016-05-28 11:02:25 · 398 阅读 · 0 评论 -
C和C指针读书笔记
1. C中变量的存储类型 存储类型分为静态存储(普通内存),堆栈,寄存器自动变量即代码块内部的变量存储于堆栈,其他变量存储于普通内存即静态存储,如果频繁访问一个变量,声明为寄存器类型后存储于硬件寄存器中。2. C中实体的链接属性(1)属于internal链接属性的标识符在同一个源文件内的所有声明中都指向同一个实体,但位于不同源文件的多个声明分属不同的实体。(2)属于ex原创 2016-04-13 12:22:10 · 410 阅读 · 0 评论 -
函数的参数传递
一、函数参数传递机制的基本理论:函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题。基本的参数传递机制有两种:值传递和引用传递。以下讨论称调用其他函数的函数为主调函数,被调用的函数为被调函数。值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实 参的值原创 2015-06-24 11:14:50 · 525 阅读 · 0 评论