![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言
谁不小心的
过于复杂,无法简介
展开
-
C语言常用库函数
标准头文件包括: 一、标准定义() 文件里包含了标准库的一些常用定义,无论我们包含哪个标准头文件,都会被自动包含进来。 这个文件里定义: l 类型size_t (sizeof运算符的结果类型,是转载 2013-07-17 07:45:39 · 908 阅读 · 0 评论 -
C语言中的算符优先级 与 常见误区
优先级运算符名称或含义使用形式结合方向说明1[]数组下标数组名[常量表达式]左到右 ()圆括号(表达式)/函数名(形参表) .转载 2013-07-10 08:35:05 · 943 阅读 · 0 评论 -
关于指针与数组
在平时的学习中,往往有一个误区“数组等于指针”,多数情况下如此,但很多时候却并不是这样。首先,file1.c:int man[100];file2.cextern int *man;上面的例子中会因为类型不匹配而报错。指针总是有类型限制,是因为编译器需要知道对指针进行接触引用的时候需要取几个字节。例如:int a[2][3][5]原创 2013-09-18 17:15:08 · 1235 阅读 · 0 评论 -
优化程序之——宏与内联函数
1.宏1.1定义简介内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。编译时,类似宏替换,使用函数体替换调用处的函数名。一般在代码中用inline修饰,但是能否形成内联函数,需要看编译器对该函数定义的具体处理。带有参数的宏定义中不含有类型名称,多行语句一般使用do while语句原创 2013-11-05 11:13:12 · 1502 阅读 · 1 评论 -
gcc提示:parameter has just a forward declaration
摘要:这是一条gcc编译程序之后的提示“参数仅仅拥有一个前置声明”1.问题来源有如下程序,我们使用gcc编译:#include 2 int fun(int i,int a;int b) 3 { 4 5 } 6 int main(int argc, char *argv[]) 7 { 8 int a=1,b=2; 9 retu原创 2013-11-05 13:48:48 · 13150 阅读 · 0 评论 -
gcc 提示conflicting types 之避免头文件重复包含
摘要:在编写程序的过程中,往往出现这样的情况。main.c需要包含A.h和B.h,而A.h&&B.h同时包含C.h,此时就出现问题了,C.h文件被同时包含了两次。如果其中含有某种类型的定义,必然在编译的时候引发错误:conflicting types #include文件的一个不利之处在于一个头文件可能会被多次包含,为了说明这种错误,考虑下面的代码:#include "x.原创 2013-11-05 17:06:49 · 2412 阅读 · 0 评论 -
C语言变长数组 struct中char data[0]的用法
摘要:在实际的编程中,我们经常需要使用变长数组,但是C语言并不支持变长的数组。此时,我们可以使用结构体的方法实现C语言变长数组。struct MyData { int nLen; char data[0];}; 在结构中,data是一个数组名;但该数组没有元素;该数组的真实地址紧随结构体MyDa原创 2013-12-01 22:27:39 · 4823 阅读 · 1 评论 -
printf 系列函数 与 可变参数函数
本篇,我们主要讲解printf的系列函数:printf, fprintf, sprintf, snprintf, vprintf, vfprintf, vsprintf, vsnprintf 的使用,然后讲解可变参数函数的使用范围与实例。1.C语言可变参数函数熟悉C的人都知道,C语言支持可变参数函数(Variable Argument Functions),即参原创 2013-12-02 14:36:29 · 3645 阅读 · 1 评论 -
EOF的含义与scanf的返回值
我学习C语言的时候,遇到的一个问题就是EOF。它是end of file的缩写,表示"文字流"(stream)的结尾。这里的"文字流",可以是文件(file),也可以是标准输入(stdin)。比如,下面这段代码就表示,如果不是文件结尾,就把文件的内容复制到屏幕上。 int c; while ((c = fgetc(fp)) != EOF) {转载 2013-12-29 17:23:46 · 9854 阅读 · 2 评论 -
与size_t有关的C语言编程失误——memset,memcpy系列函数使用陷阱
摘要:在对C语言进行编程时候,常常需要使用memset等函数进行数组或者结构体的初始化,然后这是一把双刃剑,很容易引发意想不到的bug。本文主要解析memset系列函数的使用陷阱。1.sizeof初探有如下的代码:int a[100],int *b=a;试着回答一下这几个问题:sizeof是函数吗?sizeof a返回多少?是100还是400?sizeof b呢?自己去原创 2014-01-03 11:16:01 · 1975 阅读 · 0 评论 -
C语言编程十大建议——语法语义篇:使用脚本检查部分语义错误
1.亲核字符串、数组操作之越界与否。不然,很可能出现程序可以编译通过,但是最终却给出了错误的结果。另外指针和数组的越界访问,很容易出发segment fault2.不要重写标准库函数,把函数名改成你自己才懂得的晦涩的名字,遵循一种统一的编程规范。3.在书写switch case和定义相同结构的变量的时候,如果为了少手动来写一部分代码,直接采用复制粘贴的形式,那么很有可能你的某个便另定义是错原创 2013-10-12 16:43:36 · 1789 阅读 · 0 评论 -
C语言指针类型、指针大小、指针所指元素大小、指针加减运算
摘要:在C语言编程的过程中,我们经常用到多维数组,指针的加减运算等等。如果我们想把一个二维数组传递给一个函数,为什么不能用“a[][]”这样的形参模式?而把一维数组传递给函数可以用int a[]这样的形式?内核代码中,我们常常能看到,有两个page类型的结果体指针pagea和pageb,那么pageb-pagea数值上等于多少?是地址差还是index的差值?本文主要为你解答这些问题。本原创 2013-10-28 10:49:02 · 6716 阅读 · 0 评论 -
宏定义和枚举类型的区别
摘要:在C语言的编程中,我们常常需要定义一些常量,此时是采用宏定义还是采用枚举类型呢?它们有哪些区别?本文主要探讨这个问题。一、作用域对比1.1宏定义的默认作用域为整个文件,如果定义了宏定义结尾的地方,作用域就到那个地方;这里有一个潜在的危险,如果我们的头文件中包含了宏定义,此时会导致宏定义没有按照程序员的意愿而产生了范围扩展,当在另外的文件中有了相同的宏定义以后,就会产生原创 2013-10-12 14:49:45 · 5196 阅读 · 0 评论 -
C文件编译错误:数组、数据类型不完全
摘要:在编译C文件的时候,有时候经常莫名其妙遇到错误提示:“数组元素的类型不完全错误”。本文主要解释错误原理和避免方法1.什么是不完全类型 具有不完全类型的变量可以通过多次声明组合成一个完全类型,比如数组str声明两次:char str[];char str[10];当编译器碰到第一个声明时,认为str是一个不完全类型,碰到第二个声明时str就组合成完全类型原创 2014-04-07 10:28:08 · 5865 阅读 · 0 评论 -
C系列语言中.c&&.h文件内容的区分
摘要:在开始写C程序的时候,我们往往很纳闷程序的什么部分需要放在C文件中,什么部分需要放在h文件中。本文主要从软件工程的角度,并结合一个示例,解答这个问题,并解释为什么要这样做。原创 2013-10-15 14:10:55 · 1897 阅读 · 0 评论 -
再论指针
我们都知道,如果想要通过函数改变一个变量,需要传入这个变量的指针。同样,想要改变一个指针变量,需要传入指针的指针。 27 PRIVATE char* i2a(int val, int base, char ** ps) 28 { 29 int m = val % base; 30 int q = val / base; 31 if (q) { 32原创 2014-04-10 16:47:02 · 1081 阅读 · 0 评论 -
/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found 解决方法
问题重现:当我们运行某一个用C系列语言编译而成的程序的时候,可能会接收到这个错误——这个错误的意思是,没有找到GLIBC版本是3.4.14的相应C++标准库。问题起源:首先,我们需要清楚,一个程序从被加载之后,需要进行动态链接,而动态链接,需要对应版本的glibc库。但是我们的可执行文件需要哪个版本的glibc库呢?这个版本问题,已经存在于我们的可执行文件ELF格式中。我们可以用命原创 2014-06-08 22:25:36 · 7628 阅读 · 0 评论 -
标准输入的原理:cin与scanf
1.cin 的处理方式1)如果cin读取整数,会自动忽略换行和空格;遇到文件结束标记,cin >> a返回的数false int a; while(cin >> a){ cout } return 0;eg:1, 2, 31 231 a2a 12注意:cin读取到'a'字符的时原创 2014-10-11 20:49:51 · 2889 阅读 · 0 评论 -
malloc与sizeof的合用的陷阱
摘要:在编程过程中,我们经常这样运用malloc: int * myarray=(int *)malloc(sizeof(int)*length),但是你是否知道,这一句简单的代码隐含了2个陷阱?1.关于malloc与void *指针还是分析上述代码:首先,malloc返回的值是void *类型,没有必要进行类型转化。而且这样会降低代码的易读性,很容易让你忽略mallo翻译 2013-10-25 15:53:10 · 5822 阅读 · 3 评论 -
google内部使用的良好编程习惯
摘要:在进行编程训练的过程中,遵循统一的编程习惯,有利于代码的易读性和维护性,从而快速提高软件编程效率。本文主要问你介绍一些常用的优良编程习惯,参考了google内部关于编程的约定文档。还是那句话,“没有最优,统一就好”。原创 2013-10-13 22:52:28 · 2338 阅读 · 0 评论 -
关于大小端与字节序little end与le32_to_cpu
小心不要假设字节序. PC 存储多字节值是低字节为先(小端为先, 因此是小端), 一些高级的平台以另一种方式(大端)工作. 任何可能的时候, 你的代码应当这样来编写, 它不在乎它操作的数据的字节序. 但是, 有时候一个驱动需要使用单个字节建立一个整型数或者相反, 或者它必须与一个要求一个特定顺序的设备通讯. 包含文件 定义了或者 __BIG_ENDIAN 或者 __LITT转载 2013-07-17 07:56:15 · 2156 阅读 · 0 评论 -
关于default的位置问题:default放在前面
在程序中default的位置可以任意,因为编译到exe后,程序执行时先判断所有case,然后再判断是否跳到default的地址(即指针),然后往后执行,遇到break之类的就直接跳到后面去了。(而各case和default的内嵌语句又是顺序的)原创 2013-07-17 07:59:12 · 10369 阅读 · 0 评论 -
一个more程序的实现
摘要:在linux系统中,我们经常用到more命令来显示文件内容,那么more命令是如何实现的呢?如何在终端反显一个字符串,比如“more”?如何在输入重定向的时候从键盘读入命令?本文通过more命令的实现来讲解相关知识。附录中是本文所使用的代码。原创 2013-08-28 10:20:27 · 993 阅读 · 0 评论 -
gcc -fomit-frame-pointer 选项与软件优化与调试
优化你的软件时,发觉"-fomit-frame-pointer"这个选项还是蛮有用的。GCC手册上面这么说:Don't keep the frame pointer in a register for functions that don't need one. This avoids the instructions to save, set up and restore frame转载 2013-08-29 10:30:54 · 7561 阅读 · 0 评论 -
makefile 入门指南实例——深度优先迷宫搜索
摘要,本文将以深入优先,搜索迷宫为例,讲解makefile的用法,基本规则与隐含规则,模式规则;makefile的处理过程与原理;变量的定义,如何自动生成头文件依赖关系等。翻译 2013-09-07 15:37:36 · 2366 阅读 · 0 评论 -
printf 输出格式设置\033[47\033[5m 与-8.8s
摘要:在使用linux终端命令的时候,我们可以看到像more命令,它的显示方式与一般的字符串不同,是用了反显。输出字符的时候,-8.8s是什么意思?同样,linux C下printf还有很多其他不常见的格式化输出形式。本文主要为你盘点这些形式。原创 2013-08-27 22:59:06 · 7926 阅读 · 0 评论 -
cp命令的编写——浅谈系统调用
摘要:linux中cp命令的实现,通过这个程序,我们需要了解系统调用耗费时间的方面,同时学会系统调用的错误处理机制。原创 2013-09-05 08:45:15 · 2796 阅读 · 2 评论 -
who命令的编写——登录与注销__who, whoami, who am i
摘要:who是一个linux下重要的系统内建指令,编写who命令,需要了解相关的数据结构struct utmp。同时进一步熟悉结构化数据的读取和访问方法。另外总结了系统调用相关的知识。原创 2013-09-05 10:08:16 · 2885 阅读 · 0 评论 -
C语言中回车,换行,空字符与空格:fgets和gets在读取换行符的区别
摘要:C语言中,我们常常从终端输入,并且输出到终端,键盘上的回车,输入到缓冲区以后,变成了什么字符?是‘\0’还是‘\n’?回车与换行有什么区别?本文主要为你讲解C语言中的换行、回车等控制字符,帮助区别它们的实质。原创 2013-10-01 22:46:54 · 20686 阅读 · 0 评论 -
const 关键字意义,用法与常见问题
1.const关键字意义const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。2.const关键字作用 (1)可以定义const常量,具有不可变性。 例如:const int Max=100; int原创 2013-07-17 11:06:53 · 1242 阅读 · 0 评论 -
一个C语言声明解析器的设计与实现
概论:C语言的声明解析往往复杂多样,使得初学者不知所云,例如double (*(*(*fp3)())[10])() 定义的是什么?int *a[10]和int (*a)[10]有什么区别?C语言的声明解析遵循什么规则?本文主要为你介绍C语言声明解析的规则,然后为你介绍编译器的一个与之相关的部分——声明解析器的设计与实现。原创 2013-10-09 10:48:44 · 2190 阅读 · 0 评论 -
用C语言实现有限状态自动机FSM
摘要:状态机模式是一种行为模式,在《设计模式》这本书中对其有详细的描述,通过多态实现不同状态的调转行为的确是一种很好的方法,只可惜在嵌入式环境下,有时只能写纯C代码,并且还需要考虑代码的重入和多任务请求跳转等情形,因此实现起来着实需要一番考虑。本文主要为你实现一个简单的有限状态机,没有考虑代码的重入和多任务跳转,为以后复杂的状态机实现,打下基础。原创 2013-10-10 16:04:29 · 5603 阅读 · 0 评论 -
文件读写IO
1.初级IO函数closecreatint creat(const char * pathname, mode_t mode);函数功能:创建一个文件并以只写的方式打开。如果原来该文件存在,会将这个文件的长度截短为0。函数说明若函数执行成功则返回打开文件的描述符,出错返回-1并设置errno。(关于errno详见《UNIX环境高级编程》第一章第七原创 2013-09-24 19:39:04 · 1286 阅读 · 0 评论 -
终端控制——如何在不输入回车读入字符
摘要:一般情况下,我们在终端输入一些字符,输入的同时可以编辑(增加,删除,修改),然后输入回车,这些字符被送到缓冲区。但是,在more程序和其他的程序中,比如游戏中的快捷键,我们需要的是不用输入回车就可以读取字符。此时,我们就需要了解如何控制终端,使得在不输入回车的情况下就可以读入字符。原创 2013-09-26 15:53:52 · 2833 阅读 · 0 评论 -
如何学好C语言
有人在酷壳的留言版上询问下面的问题keep_walker :今天晚上我看到这篇文章。http://programmers.stackexchange.com/questions/62502/small-c-projects我也遇到了和提问的老外一样的问题。。能给像遇到这样烦恼的程序员一点建议嘛?谢谢!我相信,这可能是很多朋友的问题,我以前也有这样的感觉,编程转载 2013-10-11 14:24:04 · 985 阅读 · 0 评论 -
typedef意义,用法与常见失误
1.typedef的意义typedef声明,简称typedef,为现有类型创建一个新的名字,或称为类型别名,在结构体定义,还有一些数组等地方都大量的用到。它有助于创建平台无关类型,甚至能隐藏复杂和难以理解的语法 。使用typedef可编写出更加美观和可读的代码。所谓美观,意指typedef能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性以及未来的可维护性。本文下原创 2013-07-17 11:24:46 · 2153 阅读 · 0 评论 -
使用有限状态自动机实现C语言的声明解析器
摘要:在很多的游戏编程中,我们使用了有限状态自动机作为模型。有限状态自动机作为变成模型,具有通用性好,方便理解的特点。本文主要结合前一个系列的两篇文章(1)C语言声明解析器的实现和(2)用C语言实现有限状态自动机 来说明如何用有限状态自动机模型实现一个C语言的声明解析器。原创 2013-10-12 15:41:10 · 2858 阅读 · 0 评论 -
gdb调试命令小结_与多文件调试_远程调试
摘要:在vs2010下,我们调试起来相当方便,但是使用gdb调试的时候,却困难重重。本文主要为你介绍如何在gdb下进行调试和如何将gdb打造成一个集成的编译环境。1.gdb命令小结设置断点:break(b) linenum b functionname跳转: 从当前函数退出:finish原创 2013-10-11 17:34:39 · 2343 阅读 · 0 评论