
C/C++
文章平均质量分 52
wind19
相互学习,共同进步
展开
-
STL——iterator
1 概述迭代器可以分为五类:输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机存取迭代器。STL中用五个类来代表这五种迭代器类别:RandomAccessBidirectionalForwardInput Output如上原创 2012-04-23 15:21:59 · 3340 阅读 · 1 评论 -
返回局部变量指针
<br />一般我们都知道不能返回局部变量的指针,但很多人知道其然,不知道所以然,那么接下来我们分析一下,先看两段代码<br />/*test1.c*/<br />#include <stdio.h><br /><br />char* get_str()<br />{<br /> char str[] = {"hello"};<br /> return str;<br />}<br /><br /><br />int main()<br />{<br />原创 2010-12-24 17:52:00 · 7367 阅读 · 0 评论 -
关于C语言中函数调用和参数传递机制的探讨
函数,相信许多人也知道其重要性;一个文件往往由一个或者多个函数构成的。然而可能许多人还不知道函数调用的一些深层问题,所以我写的这篇文章一来是应了一个好朋友的要求而写,二来希望一些朋友能够从我这篇文章了解函数调用的机制。但是并不是每个人都可以完全读懂这文章,想完全读懂此文,我想必须具备三个条件: 一、对于C语言有一定的了解,最起码有一个整体的初步了解; 二、能够读懂UNIX/LINUX下的AT&T语法的汇编;AT&T汇编与Intel汇编的差别还是挺大的;这个条件可能一转载 2010-10-25 18:21:00 · 1348 阅读 · 0 评论 -
c/c++ 书籍
http://topic.youkuaiyun.com/u/20101204/01/231e7724-5217-431c-ad44-c3adfa36add8.html?34275 收藏了很多c/c++经典书籍 http://www.taisha.org/bbs/thread-709707-1-1.html C++经典书籍介绍,很好很详细http://www.15500.net/c-000原创 2010-12-23 15:46:00 · 1039 阅读 · 0 评论 -
c语言标准
K&R C1978年,丹尼斯·里奇(Dennis Ritchie)和Brian Kernighan合作出版了《C程序设计语言》的第一版。书中介绍的C语言标准也被C语言程序设计师称作“K&R C”,第二版的书中也包含了一些ANSI C的标准。K&R C主要介绍了以下特色:结构(struct)类型长整数(long int)类型无符号整数(unsigned int)类型把运算符=+和=-改为+=和-=。因为=+和=-会使得编译器不知道用户要处理i = +10还是i =- 10,使得处理原创 2010-12-23 17:03:00 · 3040 阅读 · 0 评论 -
C语言声明的理解
<br />优先级规则分析<br />A.声明从他的第一个标识符(名字)开始读取,然后按照优先级顺序依次读取:<br />B 优先级从高到低依次是:<br /> B.1声明中被括号括起来的那部分<br /> B.2后缀操作符:<br /> 括号()表示这是一个函数,而方括号[]表示这是一个数组。<br /> B.3前缀操作符:星号*表示“指向...的指针”<br />C 如果const和(或)volatile关键字的后面紧跟类型说明符(如i原创 2010-12-27 12:16:00 · 988 阅读 · 0 评论 -
C运行时库
运行时库是程序在运行时所需要的库文件,通常运行时库是以LIB或DLL形式提供的。C运行时库诞生于20世纪70年代,当时的程序世界还很单纯,应用程序都是单线程的,多任务或多线程机制在此时还属于新观念。所以这个时期的C运行时库都是单线程的。<br /> 随着操作系统多线程技术的发展,最初的C运行时库无法满足程序的需求,出现了严重的问题。C运行时库使用了多个全局变量(例如errno)和静态变量,这可能在多线程程序中引起冲突。假设两个线程都同时设置errno,其结果是后设置的errno会将先前的覆盖,转载 2010-12-27 16:06:00 · 753 阅读 · 0 评论 -
Linux内存管理之mmap详解
转自 http://blog.chinaunix.net/uid-26669729-id-3077015.html一. mmap系统调用1. mmap系统调用 mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。munmap执行相反的操作,删除特定地址区域的对象映射。转载 2016-03-18 23:20:52 · 1967 阅读 · 0 评论 -
利用backtrace和backtrace_symbols打印函数的调用关系
<br />源程序如下<br />#include <stdio.h><br />#include <string.h><br />#include <stdint.h><br /><br />typedef uint32_t UINT32;<br /><br />void fun3(void)<br />{<br /> void* array[10] = {0};<br /> UINT32 size = 0;<br /> char **strframe = NULL;原创 2010-12-29 18:24:00 · 19501 阅读 · 4 评论 -
#pragma pack 与#pragma pack(push,1)
#pragma pack是指定数据在内存中的对齐方式,在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同(1) #pragma pack(1) 作用:调整结构体的边界对齐,让其以一个字节对齐;#pragma p转载 2010-12-16 19:26:00 · 973 阅读 · 0 评论 -
linux内存管理
本文以32位机器为准,串讲一些内存管理的知识点。 1. 虚拟地址、物理地址、逻辑地址、线性地址 虚拟地址又叫线性地址。linux没有采用分段机制,所以逻辑地址和虚拟地址(线性地址)(在用户态,内核态逻辑地址专指下文说的线性偏移前的地址)是一个概念。物理地址自不必提。内核的虚拟地址和物理地址,大部分只差一个线性偏移量。用户空间的虚拟地址和物理地址则采用了多级页表进行映射,但仍称之为线性地转载 2016-03-18 23:27:49 · 1971 阅读 · 0 评论 -
如何实现一个malloc
原文出处: 张洋的博客 任何一个用过或学过C的人对malloc都不会陌生。大家都知道malloc可以分配一段连续的内存空间,并且在不再使用时可以通过free释放掉。但是,许多程序员对malloc背后的事情并不熟悉,许多人甚至把malloc当做操作系统所提供的系统调用或C的关键字。实际上,malloc只是C的标准库中提供的一个普通函数,而且实现malloc的基本思想并不复杂,任何一个对C转载 2016-03-18 23:10:14 · 2216 阅读 · 0 评论 -
C语言中的bool
C99之前没有定义bool型,在C99中在stdbool.h中定义了_Bool为bool。所以如果是C99之前的标准,需要我们自己定义bool,如 typedef enum {false = 0, true = 1} bool;/* Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.This file is part of GCC.GCC is free software; you can redistribute it and原创 2011-02-25 16:55:00 · 9451 阅读 · 0 评论 -
static
在C/C++中,static有几种用途:1. 静态变量2. 限制变量和函数的作用域在本文件中3. 静态成员变量,静态成员变量不属于对象,所以其初始化不能用在构造函数里面,而且要想使用它必须先初始化,要不然没有分片空间的。原创 2011-03-14 16:08:00 · 707 阅读 · 0 评论 -
do while(0)的作用
<br />#define MACRO_NAME(para) do{macro content}while(0)的格式,总结了以下几个原因:<br />1,空的宏定义避免warning:#define foo() do{}while(0)2,存在一个独立的block,可以用来进行变量定义,进行比较复杂的实现。<br />3,如果出现在判断语句过后的宏,这样可以保证作为一个整体来是实现:#define foo(x) /action1(); /action2();在以下情况下:if(NULL == pPoint转载 2011-03-22 17:45:00 · 1056 阅读 · 1 评论 -
C语言中的全局变量内存分配和初始化顺序
内存分配:对于局部变量而言,内存分配的顺序和代码的顺序是一样的,但全局变量就不一定一样了。1)一般的编译器,对于初始化的全局变量,碰到之后就知道这是一个定义,会马上分配空间,如int ib =3;int ia =4;那么ia的地址就在ib之后2)对于没有初始化的全局变量,因为不知道是定义还是声明,所以要在扫描完所有代码之后才能决定,这个时候编译器会读符号表,然后看哪原创 2012-01-11 10:58:25 · 7273 阅读 · 1 评论 -
Hash学习(3)-冲突的解决
为提高hash表查找性能,除了考虑选择合适的hash表表长和完美的hash函数外,还必须考虑hash表处理冲突的能力。当hash函数对两个不同的数据项产生了相同的hash值时,冲突就产生了。对于冲突的处理,通常采用的方法可以分为三类:(1)线性再散列法,简单的按顺序遍历hash表,寻找下一个可用的槽;(2)非线性再散列法,计算一个新的hash值;(3)外部拉链法,将hash转载 2012-03-27 17:48:29 · 998 阅读 · 0 评论 -
宏
# —— 字符串##——连接两个参数#include iostream>using namespace std;#define TEST(pid) (cout#define TEST2(p) (coutint main(){ int para3 = 3; int para2 = 2; TEST(2); //cout原创 2012-04-23 17:47:09 · 658 阅读 · 0 评论 -
C语言中的数组越界
因为C语言不检查数组越界,而数组又是我们经常用的数据结构之一,所以程序中经常会遇到数组越界的情况,并且后果轻者读写数据不对,重者程序crash。下面我们来分析一下数组越界的情况:结合我的另外一篇文章 C语言的内存管理http://blog.youkuaiyun.com/wind19/archive/2010/10/25/5964090.aspx1) 堆中的数组越界原创 2010-10-25 15:01:00 · 32990 阅读 · 0 评论 -
C语言的内存管理
对于一个C语言程序而言,内存空间主要由五个部分组成代码段(.text)、数据段(.data)、BSS段(.bss),堆和栈组成,其中代码段,数据段和BSS段是编译的时候由编译器分配的,而堆和栈是程序运行的时候由系统分配的。布局如下在上图中,由编译器分配的地址空间都是在连接的时候分配的,而运行时分配的空间是在程序运行时由系统分配的BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量和静态变量 (这里注意一个问题:一般的书上都会说全局变量和静态变量是会自动初始化的,那么哪来的原创 2010-10-25 14:52:00 · 32288 阅读 · 10 评论 -
switch case 和 if else效率的比较
昨天发现了一本叫做CSAPP的(9php.com)书,终于找到了关于switch问题的(9php.com)解答。这是一段C代码:/* $begin switch-c */int switch_eg(int x) { int result = x; switch (x) { case 100: result *= 13; break; case 102: result += 10; /* Fall转载 2010-10-18 15:34:00 · 3558 阅读 · 0 评论 -
Protocol Buffer 学习笔记
今天准备用Protobuf做一些序列化下载的版本是 3.2.0 https://github.com/google/protobuf/releases/download/v3.2.0/protobuf-cpp-3.2.0.tar.gz 下载之后按照说明开始按照,在编译的时候发现编译不过,环境是centos 6.5,错误如下In file included from ./google/p原创 2017-03-07 14:07:53 · 3994 阅读 · 0 评论 -
STL的流处理类学习
概述之前一直用STL提供的流处理类写一些代码,但也没有认真总结过,对于很多东西还是不理解,这两天看了一下做一些总结,总体的类图关系如下:下面是借鉴网上的一张图,哪些类包含在哪里也写清楚了这些流处理类大致可以分为三类:1. iostream,主要是处理终端的输入输出,分为istream 和 ostream,是我们用的最多的,cin、cout、cerr都是内部定原创 2017-02-18 17:44:53 · 2384 阅读 · 0 评论 -
c++memset一个类
在c里面我们经常memset一个结构对象,c++里面得类对象也可以这么做,但需要注意:1)如果类成员包含了其他类对象,memset会导致这个成员不可用2)如果类包含虚函数,memset会把虚函数表指针清空,导致访问虚函数的时候crash原创 2016-06-08 10:18:57 · 2491 阅读 · 0 评论 -
改变对话框背景颜色
---- 方法一:调用CWinApp类的成员函数SetDialogBkColor来实现。 ---- 其中函数的第一个参数指定了背景颜色,第二个参数指定了文本颜色。下面的例子是将应用程序对话框设置为蓝色背景和红色文本,步骤如下: ---- ① 新建一个基于Dialog的MFC AppWizard应用程序Example转载 2007-09-24 10:27:00 · 1235 阅读 · 0 评论 -
vc常用方法和技巧总结
(1) 如何通过代码获得应用程序主窗口的 指针? 主窗口的 指针保存在CWinThread::m_pMainWnd中,调用AfxGetMainWnd实现。 AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED) //使程序最大化. (2) 确定应用程序的路径 Use GetModuleFileN原创 2007-09-24 10:34:00 · 1718 阅读 · 0 评论 -
VS.Net 2003/VC6.0常用快捷键集合
功能快捷键与VC比较常用获得Form的实现代码F7 n 获得对应代码的Form设计Shift + F7 n转载 2010-01-08 14:28:00 · 878 阅读 · 0 评论 -
如何在vs2008中添加lib 静态库使用
方法1:在cpp文件中 加入 #pragma comment(lib,"XXX.lib")方法2:步骤1:Tools->options->projects and solutions->VC++ directories分别在包含文件,库文件填加了路径(这些路径只告诉编译器怎么找文件,没有说把那里面的文件加入工程,若不设置,编译报错:无法打开***文件) 步骤2:Proj转载 2012-06-28 20:18:08 · 834 阅读 · 0 评论 -
VC 调试技巧
查看数组中各元素的值比如有一个char * ptr;我们要查看其中10个元素的值可以这样 ptr, 10;如果要显示16进制,只要在“值”栏点击右键选择16进制显示,这样到“名称”点击ptr展开就可以看到个元素的值了 快捷键F5: 开始调试Shift+F5: 停止调试F10: 调试到下一句,这里是单步跟踪 F11: 调试到下一句,跟进函数内部Shift+原创 2012-07-31 13:19:08 · 771 阅读 · 0 评论 -
VC 编译链接错误总结
Error LNK2001 无法解析的外部符号 除了网上说的一些方法,我碰到的一种情况是在项目设置-> 连接器 --> 输入--> 忽略所有默认库选择“否”就OK了原创 2012-10-15 19:51:26 · 1001 阅读 · 2 评论 -
Run-Time Check Failure #2 - Stack around the variable 'var' was corrupted
今天调式的时候VC跳出了Run-Time Check Failure #2 - Stack around the variable 'var' was corrupted信息,但选择继续之后程序照旧运行。后来看代码之后发现是数组访问越界,比如我有一个数组 char szbuf[5]; 但用szbuf[5]去访问内存就会出现这个问题。与这个类似还有new出来的一个空间,如果越界写,d原创 2012-12-20 10:27:22 · 1371 阅读 · 0 评论 -
明明include了对应的文件,但编译器报错不认识这个类定义
今天遇到一个编译问题,比如有三个文件 a.h, b.h, c.h 定义了三个类 a,b, c,并且没有.cpp文件,都是在.h里面实现的,发现c.h 包含了a.h,但说不认识 a。后来看了一下原来是形成了环状包含, a.h, 包含了 b.h, b.h又包含了c.h,所以编译a的时候没有完成就又去编c去了,而c又要用到a,所有编译不过了。我们可以用#pragma message("xxx")来让编原创 2013-03-04 15:39:04 · 1834 阅读 · 0 评论 -
C/C++代码优化的27个建议
本文由 伯乐在线 - 周昌鸿 翻译自 cs.clemson.edu。欢迎加入技术翻译小组。转载请参见文章末尾处的要求。1. 记住阿姆达尔定律:funccost是函数func运行时间百分比,funcspeedup是你优化函数的运行的系数。所以,如果你优化了函数TriangleIntersect执行40%的运行时间,使它运行快了近两倍,而你的程序会运行快25%。这意味着不经转载 2014-05-26 10:09:49 · 2606 阅读 · 0 评论 -
讲讲volatile的作用
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子: 1). 并行设备的硬件寄存器(如:状态寄存器) 2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic转载 2009-04-07 16:48:00 · 1153 阅读 · 1 评论 -
C语言运算符表
运算符按照优先级大小由上向下排列,在同一行的运算符具有相同优先级。第二行是所有的一元运算符。 运算符解释结合方式() [] -> .括号(函数等),数组,两种结构成员访问由左向右! ~ ++ -- + - * & (类型) sizeof否定,按位否定,增量,减量,正负号,原创 2009-07-02 10:48:00 · 868 阅读 · 0 评论 -
指针,指针数组,数组指针,函数指针
################################# ## 基本知识 ## #################################当然我们一切都是从最简单的内建类型开始,最后我会做一些推广。先看原创 2009-07-02 10:59:00 · 1301 阅读 · 0 评论 -
c语言笔试题
1、链表反转问题 #include //元结点struct Node{ int data; Node *next;}; typedef struct Node Node;//链表反转(循环方法)Node *Reverse(Node *head){ Node *prev = NULL;原创 2009-07-06 23:48:00 · 1655 阅读 · 1 评论 -
new,delete, malloc, free
今天我在写程序的时候,把一个new出来的指针ptr delete了两次,结果导致程序运行一会就crash,用gdb调式了一下发现时内存访问错误,但每次发生错误的地方都不一样,而且有点莫名奇妙。找了好久,后来才发现时delete了两次,那么第二次delete ptr的时候,这块内存原创 2010-06-09 13:11:00 · 752 阅读 · 0 评论 -
printf的重定向与恢复
把行信息打印到stdio窗口,然后再有一行到文件,接着又有一行到stdio屏幕。先来看一个错误的例子#include int main (int argc, char *argv[]){FILE *copy;printf ("This is printed to screen!\n");copy = stdout;stdout = f原创 2012-04-25 17:00:02 · 9061 阅读 · 0 评论 -
glibc中strcpy,strcat,strcmp,memcpy等函数的实现和分析
http://www.oschina.net/code/explore/glibc-2.9/string/memcpy.c 可以找到所有glibc的源代码strcpy源码char *strcpy (dest, src)char *dest;const char *src;{ reg_char c; char *__unbounded s原创 2012-05-06 11:38:33 · 3639 阅读 · 0 评论