C/C++
文章平均质量分 86
sole_cc
这个作者很懒,什么都没留下…
展开
-
C语言清空输入缓冲区的N种方法对比
C语言中有几个基本输入函数://获取字符系列int fgetc(FILE *stream);int getc(FILE *stream);int getchar(void);//获取行系列char *fgets(char * restrict s, int n, FILE * restrict stream);char *gets(char *s);//可能导致溢出,用fgets代替转载 2014-10-22 22:01:20 · 750 阅读 · 0 评论 -
C语言:流和缓冲区
流(stream)是一个很抽象的概念,《C程序设计语言》中这样定义:流与磁盘或其它外围设备关联的数据的源或目的地。在Unix/Linux中,文本流和二进制流是相同的,但在Windows中,稍有差异,所以C标准库提供了这两种类型的流。文本流是由文本行组成的序列,每一行包含0个或多个字符,并以'\n'结尾。在某些环境中, 可能需要将文本流转换为其它表示形式(例如把'\n'映射成回车符和转载 2014-10-22 21:22:56 · 5257 阅读 · 2 评论 -
C语言常见错误中英文对照表
常见错误中英文对照表fatal error C1003: error count exceeds number; stopping compilation 中文对照:错误太多,停止编译 分析:修改之前的错误,再次编译fatal error C1004: unexpected end of file found转载 2014-10-25 14:37:52 · 2715 阅读 · 0 评论 -
Source Insight函数调用关系显示设置
当我们需要设置source Insight的项目代码中函数调用关系时,可通过如下的设置来实现:1、显示函数调用关系窗口 Source Insight工具栏中“View”—>“Relation Window”,选中“Relation Window”则在右下角显示一个函数调用关系窗口,如图:上图表示ServiceMain函数调用了其他函数,例如调用了ServiceDelete函数等。转载 2014-10-07 19:27:59 · 1113 阅读 · 0 评论 -
Linux GCC常用命令
1简介2简单编译2.1预处理2.2编译为汇编代码(Compilation)2.3汇编(Assembly)2.4连接(Linking)3多个程序文件的编译4检错5库文件连接5.1编译成可执行文件5.2链接5.3强制链接时使用静态链接库1简介GCC 的意思也只是 GNU C Compiler 而已。转载 2014-10-08 16:14:57 · 549 阅读 · 0 评论 -
C程序内存分配
内存管理基本概念.1.1 C程序内存分配1.C程序结构下面列出C语言可执行程序的基本情况(Linux 2.6环境/GCC4.0)。[root@localhost Ctest]# ls test -l //test为一个可执行程序-rwxr-xr-x 1 root root 4868 Mar 26 08:10 test[root@localh转载 2014-09-24 16:57:12 · 770 阅读 · 0 评论 -
C语言中局部变量和全局变量的存储类别(static,extern,auto,register)
1.局部变量和全局变量在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结束立即释放。这一点表明形参变量只有在函数内才是有效的,离开该函数就不能再使用了。这种变量有效性的范围称变量的作用域。不仅对于形参变量,C语言中所有的量都有自己的作用域。变量说明的方式不同,其作用域也不同。C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。1.1局部变量局部变量也转载 2014-10-08 21:48:03 · 3359 阅读 · 0 评论 -
c语言中static和extern的用法详细解析
一,static和extern:大工程下我们会碰到很多源文档。文档a.c复制代码代码如下:static int i; //只在a文档中用int j; //在工程里用static void init() //只在a文档中用{}void callme() //在工程中用{ static int转载 2014-10-08 22:03:44 · 770 阅读 · 0 评论 -
C语言的编译链接过程详解
C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。链接是把目标文件、操作系统的启动代码和用到的库文件进行组织,形成最终生成可执行代码的过程。过程图解如下:从图上可以看到,整个代码的编译过程分为编译和链接两个过程,编译对应图中的大括号括起的部分,其余则为链接过程。转载 2014-10-10 19:46:08 · 808 阅读 · 0 评论 -
linux可执行文件的内容分析工具nm ldd
;nm是用来查看指定程序中的符号表相关内容的工具。下面通过例子,分别来介绍一下这两个工具:1. ldd是用来分析程序运行时需要依赖的动态库的工具, 先看下面的例子, 用ldd查看cs程序所依赖的动态库:转载 2014-10-10 10:29:28 · 1847 阅读 · 0 评论 -
C语言函数名与函数指针详解
一、通常的函数调用一个通常的函数调用的例子:/* 自行包含头文件 */void MyFun(int x); /* 此处的声明也可写成:void MyFun(int) */int main(int argc, char* argv[]){ MyFun(10); /* 这里是调用MyFun(10) 函数 */ return(0);}void MyFun(in转载 2014-10-12 20:26:00 · 428 阅读 · 0 评论 -
由scanf说起之1:scanf函数和回车、空格 及其返回值
scanf和回车的关系: 先看一个我们经常使用的代码: char c; scanf("%c", &c); scanf 的各种格式中,%d、%c、%s三种最常用,通常都是以回车作为一次输入的结束。由于对字符解析方式及字符特点不同(如数字中一般不会出现空格回车等特殊字符)不同,%d格式一般不会在连续输入时,遇到问题。而%s和%c却会出现各种各样的问题,比如回车问题转载 2014-10-14 15:38:26 · 820 阅读 · 0 评论 -
CPU位数、操作系统位数、指令集、寄存器位数、机器字长等
CPU位数 = CPU中寄存器的位数 = CPU能够一次并行处理的数据宽度 = 数据总线宽度CPU为了实现其功能一般设计了指令集,即是CPU的全部指令,这就是机器语言。计算机的所有功能都是基于CPU的指令集。指令集和CPU的位数是有联系 的。如Intel 8086 CPU 是16位,其指令集也是16位。如Intel 80386DX CPU 是32位,其指令集也是32位,但它也保持原原创 2014-11-17 11:34:16 · 11420 阅读 · 0 评论 -
标准C预处理器(指令)
标准C预处理器该文章借鉴一位老兄的文章,主要是取自PROGRAMMING IN ANSI c(Third Edition).什么是预处理器?答:预处理器在源代码通过编译器之前,先对源代码进行处理。它是在成为预处理器命令行或指令的控制下操作。预处理器指令放在源程序的main函数之前。在源代码通过编译器之前,由预处理器检查所有预处理指令。如果有预处理器指令,则采取相转载 2014-10-14 12:17:46 · 570 阅读 · 0 评论 -
由scanf说起之2:由scanf看 不同类型变量的变量名和内存的关系
在使用scanf时很需要注意一点就是取地址运算符&,这个运算符不留神就很容易忘记,将会产生是一个针对内存的冲突,错误不易查找并且严重,见下面的代码: int i = 2; scanf_s("%d", i); 上面的代码不小心失掉了&运算符[s1] ,会发生下面的冲突(之前已为i赋值2,所以是在位置0x00000002处访问冲突。而如果没有赋值,则是在0xcccccccc转载 2014-10-14 15:44:37 · 762 阅读 · 0 评论 -
深入理解C系列:不同类型变量的变量名和内存间的关系
有了前面两篇的基础,下面正式开扒变量名和内存的关系,先看一段大家很熟悉的代码: int i; scanf_s("%d", &i); int i;,在这一句就为i分配了内存(但尚未对这块内存进行初始化),所以可以通过&i直接使用这块内存。赋值就更不用说啦,i = 3;。 变量名i,是为方便编程人员使用,是这块内存的别名,指代到块内存,对编程人员i代表这块内存中存转载 2014-10-14 16:28:57 · 836 阅读 · 0 评论 -
C语言 getopt()函数
getopt(分析命令行参数) 相关函数表头文件 #include定义函数 int getopt(int argc,char * const argv[ ],const char * optstring);函数说明 getopt()用来分析命令行参数。参数argc和argv是由main()传递的参数个数和转载 2014-10-14 18:09:57 · 558 阅读 · 0 评论 -
使用 getopt() 进行命令行处理
轻松处理复杂命令行所有 UNIX® 程序甚至那些具有图形用户界面(graphical user interface,GUI)的程序,都能接受和处理命令行选项。对于某些程序,这是与其他程序或用户进行交互的主要手段。具有可靠的复杂命令行参数处理机制,会使得您的应用程序更好、更有用。不过很多开发人员都将其宝贵的时间花在了编写自己的命令行解析器,却不使用 getopt(),而后者是一个转载 2014-10-14 22:05:43 · 441 阅读 · 0 评论 -
Linux C多线程编程入门(基本API及多线程的同步与互斥)
介绍:什么是线程,线程的优点是什么线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可以看作是Unix进程的表亲,同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local s转载 2014-11-01 16:40:14 · 1111 阅读 · 0 评论 -
C语言运算符优先级 详细列表
恩,问这个问题的人太多了,懒得继续回答,直接贴上来自己看。。。优先级运算符名称或含义使用形式结合方向说明1[]数组下标数组名[常量表达式]左到右()圆括号转载 2014-10-15 16:36:40 · 948 阅读 · 0 评论 -
gdb命令
gdb命令包含在GNU的gcc开发套件中,是功能强大的程序调试器。GDB中的命令固然很多,但我们只需掌握其中十个左右的命令,就大致可以完成日常的基本的程序调试工作。 命令 解释 示例 file 加载被调试的可执行程序文件。 因为一般都在被调试程序所在目录下执行GDB,因而文本名不需要带路径。 (gdb) file gdb-sample r Run的简写,运行被调试的程序。 如果此前没有下过断转载 2014-10-18 16:03:29 · 702 阅读 · 0 评论 -
c语言socket编程指南
介绍 Socket 编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措?等等… 好在我已经将这些事完成了,我将和所有人共享我的知识了。如果你了解 C 语言并想穿过网络编程的沼泽,那么你来对地方了。 --------------------------转载 2014-11-03 10:45:44 · 634 阅读 · 0 评论 -
如何写Makefile(二)——规则篇(上)
一、显式规则(Explicit Rules)通常在写makefile时使用的都是显式规则,这需要指明target和prerequisite文件。一条规则可以包含多个target,这意味着其中每个target的prerequisite都是相同的。当其中的一个target被修改后,整个规则中的其他target文件都会被重新编译或执行。通配符(Wildcards)make支持的通配符与B转载 2014-10-18 13:00:30 · 778 阅读 · 0 评论 -
如何写Makefile(二)——规则篇(中)
三、 查找文件(VPATH)上一篇所使用的例子中,makefile和源文件都是在同一个简单目录下,但真正的程序往往会复杂很多。让我们重新修改整个程序,添加一个叫做counter的函数,同时添加counter.c:[cpp] view plaincopy#include #include void counter( in转载 2014-10-18 13:35:28 · 739 阅读 · 0 评论 -
C语言标准库函数
C语言标准头 断言 字符类测试 (部分)库函数抛出的错误代码 浮点数运算 检测整型数据类型值范围 本土化 数学函数 “非局部跳转” 信号 可变参数列表 一些常数,类型和变量 输入和输出 实用功能 字符串函数 时间和日期函数 断言头文件唯一的目的是提供宏assert的定义。如果断言非真(expression==0),则程序会转载 2014-10-20 11:07:06 · 1056 阅读 · 0 评论 -
如何写Makefile(二)——规则篇(下)
接前面两篇学习日记:如何写Makefile(二)——规则篇(中)和 学习日记:如何写Makefile(二)——规则篇(上)五、 隐含规则数据库GNU make 3.80拥有90多个内建隐含规则。隐含规则即是模式匹配规则又是后缀规则。这些规则支持的语言有很多: C++, Pascal, FORTRAN, ratfor, Modula, Texinfo, TEX (包括Tangle 和转载 2014-10-18 13:59:05 · 786 阅读 · 0 评论 -
X86_64上没有写C函数声明导致的BUG(warning: initialization makes pointer from integer without a cast)
我的博客:http://blog.striveforfreedom.netTable of Contents1 简介2 导致崩溃的代码及解决思路2.1 导致崩溃的代码2.2 解决思路3 小结1 简介最近修改一个用C写的开源程序,需要加几个函数,因为偷懒没写函数声明,导致程序崩溃,最后花了很多时间才查明原因,原来是没有写函数声明惹的祸。感觉这个转载 2014-10-18 20:26:43 · 20119 阅读 · 0 评论 -
C语言常用头文件总结
C语言常用头文件总结序号 库类别 头文件 1 字符处理 ctype.h 2 地区化 local.h 3 数学函数 math.h 4 信号处理 signal.h 5 输入输出 stdio.h 6 实用工具程序 stdlib.h 7 字符串处理 string.h转载 2014-10-20 10:47:50 · 7283 阅读 · 0 评论 -
透析C语言可变参数问题(一)
首先在介绍可变参数表函数的设计之前,我们先来介绍一下最经典的可变参数表printf函数的实现原理。一、printf函数的实现原理在C/C++中,对函数参数的扫描是从后向前的。C/C++的函数参数是通过压入堆栈的方式来给函数传参数的(堆栈是一种先进后出的数据结构),最先压入的参数最后出来,在计算机的内存中,数据有2块,一块是堆,一块是栈(函数参数及局部变量在这里),而栈是从内存的高地址向低地转载 2014-10-21 10:03:23 · 546 阅读 · 0 评论 -
Linux 关于动态链接库以及静态链接库的一些概念
库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。例如:libhello.so libhello.a 为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: libhello.so.1.0,由于程序连接默认以.so为文件后缀名。所以为了使用这些库,通常使用建立符号连接的方式。 ln -s libhello.so.1.0 libhello.so.1 ln转载 2014-10-10 10:06:52 · 705 阅读 · 0 评论 -
透析C语言可变参数问题(二)
一、是什么我们学习C语言时最经常使用printf()函数,但我们很少了解其原型。其实printf()的参数就是可变参数,想想看,我们可以利用它打印出各种类型的数据。下面我们来看看它的原型:int printf( const char* format, ...);它的第一个参数是format,属于固定参数,后面跟的参数的个数和类型都是可变的(用三个点“…”做参数占位符),实际调用时可以有转载 2014-10-21 10:09:51 · 698 阅读 · 0 评论 -
源码阅读——十个C开源项目
代码阅读——十个C开源项目1. Webbench2. CMockery3. Libev4. Memcached5. Lua6. SQLite7. Redis8. Nginx9. UNIXv610. NETBSD代码阅读——十个C开源项目1. WebbenchWebbench是一个在linux下使用的非常简单的网站压转载 2014-11-08 15:45:56 · 981 阅读 · 0 评论 -
C语言\r\n和\n区别
关于\r和\n的小问题的思考 计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。 于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定转载 2015-01-14 10:14:51 · 6985 阅读 · 0 评论 -
C获取linux系统环境变量方法(Environment Variables)
主要有三种方法,都很简单。1 一个单纯c语言获取的方式#include #include int main(){ char *pathvar = getenv("PATH"); printf("pathvar is : %s\n",pathvar); return 0;}getenv() 是在stdlib中定义的,当然我们也可以在c++中,通过 #includ原创 2014-12-28 14:55:05 · 9571 阅读 · 0 评论 -
C字符串的小问题
今天遇到这样一种写法(C语言):char * str="abc" "def"; 这样也能给字符串赋值,语法好奇怪,你们见过吗;两个被双引号括起来的字符串,只要当中是空格(包括换行),C就认为这是一个字符串。在《C PRIMER PLUS》第四章的Exploring and Exploiting printf() and scanf()小节中有如下引文:new with ANSI C,原创 2015-02-06 21:10:05 · 458 阅读 · 0 评论 -
文件描述符 文件描述标志 文件状态标志
文件描述符 File Descriptors文件描述标志 File Descriptors Flag文件状态标志 File Status Flag文件描述符是一个标示,非负整数,类似于windows里的句柄,为了与标准C保持一致(标准C里的文件的读写都是通过File Pointer)UNIX采用了这样的三级结构,我混淆于文件描述标志和文件状态标志,还是看转载 2015-02-15 10:17:39 · 1487 阅读 · 0 评论 -
常见排序算法的实现与性能比较
插入排序直接插入排序时间复杂度O(n^2), 空间复杂度O(1)排序时间与输入有关:输入的元素个数;元素已排序的程度。最佳情况,输入数组是已经排好序的数组,运行时间是n的线性函数(O(n)); 最坏情况,输入数组是逆序,运行时间是n的二次函数(O(n^2))。介绍:插入排序的工作原理是,对于每个未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。转载 2015-03-22 10:23:41 · 793 阅读 · 0 评论 -
C++类对象内存模型与成员函数调用分析(上)
C++类对象内存模型是一个比较抓狂的问题,主要是C++特性太多了,所以必须建立一个清晰的分析层次。一般而言,讲到C++对象,都比较容易反应到以下这个图表: 这篇文章,就以这个表格作为分析和行文的策略的纵向指导;横向上,兼以考虑无继承、单继承、多重继承及虚拟继承四方面情况,这样一来,思维层次应该算是比较清晰了。1、C++类数据成员的内存模型1.1 无继承情况实验最能说明转载 2015-04-08 10:35:23 · 621 阅读 · 0 评论 -
C++类对象内存模型与成员函数调用分析(下)
2.4.2 多重继承下的虚拟函数多重继承下的虚拟函数主要有一下几个麻烦:1. 几个父类都声明了相同原型的virtual函数;2. 有不止一个父类将其析构函数声明为虚拟;3. 一般的虚拟函数问题;先给出代码段9。class Parent1{public: Parent1() : data_parent1(0.0)转载 2015-04-08 11:34:12 · 468 阅读 · 0 评论 -
C++类对象内存模型与成员函数调用分析(中)
2.4 虚拟成员函数这是本文中最复杂也最有趣的话题了。虚拟函数也是和继承这个话题相伴相生,所以本节将纳入对单继承、多重继承和虚拟继承,一起描述他们之间的关系,这样,对C++对虚拟函数的调用,以及由此所变现出来的多态的理解,应该是非常清晰了。2.4.1 单继承下的虚拟成员函数对于虚拟函数,我们首先引入两个数据结构,为什么引入一会就知道了。1转载 2015-04-08 10:57:09 · 409 阅读 · 0 评论