![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
平平谈谈才是真
这个作者很懒,什么都没留下…
展开
-
怎么解决内存泄露问题?
1. 一般内存泄露都是在new 和delete 或malloc和free没有成对使用的情况下产生的。在代码量较少的情况下可自行检测。确保两着成对使用。2. c++中有智能指针的概念,sp和wp。这也是内存管理,避免内存泄露的一个方法。不过这个概念相对难度大一些。lz感兴趣的话可以上网搜关键字“C++智能指针”。3.在一些大的软件工程中,一般在代码设计完成后,会使用一些代码检测工具对代码的运转载 2013-02-21 20:10:34 · 1197 阅读 · 0 评论 -
语言编程需要注意的64位和32机器的区别
一、数据类型特别是int相关的类型在不同位数机器的平台下长度不同。C99标准并不规定具体数据类型的长度大小,只规定级别。作下比较:16位平台char 1个字节8位short 2个字节16位int 2个字节16位long 4个字节32位指针 2个字节32位平台char转载 2012-03-01 10:55:10 · 384 阅读 · 0 评论 -
VC命令行下重定向
BOOL CDOSDlg::ExecDosCmd(){ #define EXECDOSCMD "dir c:" //可以换成你的命令SECURITY_ATTRIBUTES sa;HANDLE hRead,hWrite;sa.nLength = sizeof(SECURITY_ATTRIBUTES);sa.lpSecurityDescriptor = NULL;sa转载 2012-02-06 17:57:18 · 556 阅读 · 0 评论 -
大端模式和小端模式
对于整型和长整型等数据类型,big endian 认为第一个字节在高位字节(按照地址从低到高的顺序存放数据的高位字节和低位字节),而little endian则相反,认为第一个字节是最低位字节(按照从低地址到高地址的顺序存放数据的地位字节和高位字节)。例如:假设从内存地址0x0000开始有以下数据:0x0000 0x0001 0x0002 0x0003 0转载 2011-12-20 11:39:35 · 400 阅读 · 0 评论 -
解析大端模式和小端模式
一、概念及详解 在各种体系的计算机中通常采用的字节存储机制主要有两种: big-endian和little-endian,即大端模式和小端模式。 先回顾两个关键词,MSB和LSB: MSB:MoST Significant Bit ------- 最高有效位 LSB:Least Significant Bit ------- 最低有效位 大端模式(big-转载 2011-12-20 11:14:38 · 408 阅读 · 0 评论 -
GetMemory函数的几种经典考法
代码1: void GetMemory(char *p){ p = (char*)malloc(100);}int main(int argc, char *argv[]){ char *str = NULL; GetMemory(str); strcpy(str, "Hello"); return 0;}str没有得到分配内存的地址值。 内存空转载 2011-12-05 14:44:37 · 347 阅读 · 0 评论 -
c语言内存泄露示例
正确的内存管理的重要性存在内存错误的 C 和 C++ 程序会导致各种问题。如果它们泄漏内存,则运行速度会逐渐变慢,并最终停止运行;如果覆盖内存,则会变得非常脆弱,很容易受到恶意用户的攻击。从 1988 年著名的莫里斯蠕虫 攻击到有关 Flash Player 和其他关键的零售级程序的最新安全警报都与缓冲区溢出有关:“大多数计算机安全漏洞都是缓冲区溢出”,Rodney Bates 在 2004转载 2011-12-05 13:46:58 · 1288 阅读 · 1 评论 -
C/C++程序内存分配详解
一个由C/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。程序结束时由编译器自动释放。2、堆区(heap) — 在内存开辟另一块存储区域。一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全转载 2011-11-11 20:08:06 · 376 阅读 · 0 评论 -
UCOS-II移植ARM的笔记
UCOS-II的移植需要提供2,3个文件分别介绍如下:一:OS_CPU.H1 与编译器有关的数据类型经典的全局变量定义,可以套用,简洁明了实用性好。#ifdef OS_CPU_GLOBALS#define OS_CPU_EXT#else#define OS_CPU_EXT extern#endif 只是按照不同的编译器编写对应的数据类型的typedef转载 2011-11-11 13:57:44 · 619 阅读 · 0 评论 -
数据结构复习之[循环队列]
线性结构的两种常见应用之二队列定义:一种可以实现“先进先出”的存储结构。分类:离散(链式)队列--用链表实现静态(连续)队列--用数组实现静态队列通常必须是循环队列循环队列的必须要弄清除的7个问题:1.静态队列为什么必须是循环队列由于连续空间的问题,为了节省空间,方便操作转载 2011-11-10 21:06:08 · 530 阅读 · 0 评论 -
深入理解c语言——char的范围为什么是-128到127而不是-127到127
对于多数编译器而言(包括VC++),char 都视作 signed char来处理,这时 char 的取值范围得与二进制编码技术有关,对于补码表示法。char 的取值范围是 -128 - 127, 对于符号绝对值编码法、反码记法, char 的取值范围是 -127 - 127。char 有 8 位,最高位是符号位,所以 char可以在 -127 - 127 取值是没有疑问了。当最高位是 1,其转载 2011-10-25 16:56:41 · 1493 阅读 · 0 评论 -
C语言中的数据类型转换问题
C语言中的数据类型转换问题● 字符型变量的值实质上是一个8位的整数值,因此取值范围一般是-128~127,char型变量也可以加修饰符unsigned,则unsigned char 型变量的取值范围是0~255(有些机器把char型当做unsighed char型对待,取值范围总是0~255)。● 如果一个运算符两边的运算数类型不同,先要将其转换为相同的类型,即较低类型转换为较高类型,然后转载 2011-10-25 17:08:40 · 1482 阅读 · 0 评论 -
VC串口通讯
1.建立项目 2.在项目中插入MSComm控件 3.利用ClassWizard定义CMSComm类控制变量 4.在对话框中添加控件 5.添加串口事件消息处理函数OnComm() 6.打开和设置串口参数 7.发送数原创 2011-08-02 23:01:26 · 546 阅读 · 0 评论 -
解析C语言中的sizeof
<br />解析C语言中的sizeof <br /> <br />一、sizeof的概念 <br />sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 <br /> <br />二、sizeof的使用方法 <br />1、用于数据类型 <br /> <br />sizeof使用形式:sizeof(type) <br /> <br />转载 2011-04-01 22:05:00 · 468 阅读 · 0 评论 -
堆和栈的区别
堆和栈的区别<br />一、预备知识—程序的内存分配<br />一个由c/C++编译的程序占用的内存分为以下几个部分<br />1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。<br />2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。<br />3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全转载 2010-11-18 15:11:00 · 410 阅读 · 0 评论 -
CRC算法与实现
<br /> <br />CRC的全称为Cyclic Redundancy Check,中文名称为循环冗余校验。它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差错控制。实际上,除数据通信外,CRC在其它很多领域也是大有用武之地的。例如我们读软盘上的文件,以及解压一个ZIP文件时,偶尔会碰到“Bad CRC”错误,由此它在数据存储方面的应用可略见一斑。<br />差错控制理论是在代数理论基础上建立起来的。这里我们着眼于介绍CRC的算法与实现,对原理只能捎带说明一下转载 2010-10-28 13:21:00 · 524 阅读 · 0 评论 -
BCB 静态编译
要编译成静态连接库,可以在所有机上运行的程序,只要这样做:打开【project】的【Options】,把packages页中的‘build with runtime packages’的勾去掉,linker页中的‘use dynamic Rtl’的勾去掉,再在compiler页中按release键。转载 2012-03-13 14:54:13 · 1331 阅读 · 0 评论 -
[C语言内存分配] text段,data段,bss段
一个程序一般分为3段:text段,data段,bss段 text段:就是放程序代码的,编译时确定,只读, data段:存放在编译阶段(而非运行时)就能确定的数据,可读可写 就是通常所说的静态存储区,赋了初值的全局变量和静态变量存放在这个区域,常量也存放在这个区域 bss段:定义而没有赋初值的全局变量和静态变量,放在这个区域 这个够不够清楚呢? 堆栈就是栈的简称。 堆和栈转载 2012-07-04 17:46:32 · 4497 阅读 · 0 评论 -
大小端、网络字节序问题
总结:1、80X86使用小端法,网络字节序使用大端法。 2、二进制的网络编程中,传送数据,最好以unsigned char, unsigned short, unsigned int 来处理, unsigned short ,unsigned short 以网络字节序处理后再拷贝到发送的buffer里 3、结构体前要指定转载 2013-02-21 19:41:12 · 559 阅读 · 0 评论 -
可重入函数与不可重入函数的区别
可重入函数可以做这样的基本定义:重入意味着这个函数可以重复进入,可以被并行调用,可以被中断,它只使用自身栈上的数据变量,它不依赖于任务环境,在多任务调度过程中,它是安全的,不必担心数据出错。 不可重入函数基本上与可重入函数有相反的定义了:不可重入,意味着不可被并行调度,否则会产生不可预料的结果,这些函数提内一般使用了静态(static)的数据结构,使用了malloc()或者free()函转载 2013-02-21 19:35:13 · 628 阅读 · 0 评论 -
linux下可重入函数
可重入函数(即可以被中断的函数)可以被一个以上的任务调用,而不担心数据破坏。可重入函数在任何时候都可以被中断,而一段时间之后又可以恢复运行,而相应的数据不会破坏或者丢失。可重入函数使用的变量有两种情况:1.使用局部变量,变量保存在CPU寄存器中或者堆栈中;2.使用全局变量,但是这时候要注意保护全局变量(防止任务中断后被其它任务改变变量)。?1转载 2013-02-21 19:16:28 · 440 阅读 · 0 评论 -
C语言可变参数
一、是什么我们学习C语言时最经常使用printf()函数,但我们很少了解其原型。其实printf()的参数就是可变参数,想想看,我们可以利用它打印出各种类型的数据。下面我们来看看它的原型:[cpp] view plaincopyprint?int printf( const char* format, ...); int printf( const cha转载 2012-12-12 00:22:48 · 633 阅读 · 0 评论 -
[Win32]一个调试器的实现(一)调试事件与调试循环
前言程序员离不开调试器,它可以动态显示程序的执行过程,对于解决程序问题有极大的帮助。如果你和我一样对调试器的工作原理很感兴趣,那么这一系列文章很适合你,这些文章记录了我开发一个调试器雏形的过程,希望对你有帮助。或许我写的代码很拙劣,还请大家多多见谅! 这个调试器使用Visual Studio 2010作为开发工具,是一个控制台程序。为了简化,一切输入输出都使用C++标准库的相关类,而且转载 2012-12-10 21:51:07 · 456 阅读 · 0 评论 -
elf文件格式与动态链接库
机器执行的是机器指令,而机器指令就是一堆二进制的数字。高级语言编写的程序之所以可以在不同的机器上移植就因为有为不同机器设计的编译器的存在。高级语言的编译器就是把高级语言写的程序转换成某个机器能直接执行的二进制代码。以上的知识在我们学习CS(Computer Science)的初期,老师都会这么对我们讲。但是我就产生疑问了:既然机器都是执行的二进制代码,那么是不是说只要硬件相互兼容,不同操作系统下的转载 2012-12-22 00:19:24 · 640 阅读 · 0 评论 -
assert宏的实现
在看《编写高质量的C语言代码》中第二章提到,使用断言,于是翻出以前看过的《C标准库》查看assert宏的实现。这篇文章主要内容来自 《C标准库》1.头文件中除了定义宏assert以外还引用了另外一个宏 NDEBUG,后者不是定义在中的。如果NDEBUG出现在任何包含的文件中,并被定义为宏名,那么宏assert就直接被定义为:[cpp] view plaincop转载 2012-12-09 00:32:40 · 524 阅读 · 0 评论 -
Linux内核中的printf实现
从main.c中的printf开始读这个函数。首先看printf函数的定义:1 static int printf(const char *fmt, ...)2 {3 va_list args;4 int i;5 6 va_start(args, fmt);转载 2012-12-08 23:44:27 · 985 阅读 · 0 评论 -
C语言条件编译及编译预处理阶段
一、C语言由源代码生成的各阶段如下:<!--p {margin-bottom:0.21cm}-->C源程序->编译预处理->编译->优化程序->汇编程序->链接程序->可执行文件 其中 编译预处理阶段,读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理。或者说是扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。预处理过程先转载 2012-12-07 19:59:07 · 375 阅读 · 0 评论 -
C/C++程序到内存分配个人总结
一、一个由C/C++编译到程序占用的内存分为以下几个部分:1、栈区(stack)——由编译器自动分配释放,在不需要的时候自动清除。用于存放函数的参数、局部变量等。操作方式类似数据结构中的栈(后进先出)。2、堆区(heap)——一般由程序员分配释放,若程序员分配后不释放,程序结束后可能由OS回收。不同于数据结构中的堆,分配方式有些类似链表。3、全局区(静态区)——全局变量和静态变量存储在转载 2012-12-07 20:03:09 · 363 阅读 · 0 评论 -
C++函数声明和定义
声明是告诉编译器一些信息,以协助编译器进行语法分析,避免编译器报错。而定义是告诉编译器生成一些代码,并且这些代码将由连接器使用。即:声明是给编译器用的,定义是给连接器用的。这个说明显得很模糊,为什么非要弄个声明和定义在这搅和?那都是因为C++同意将程序拆成几段分别书写在不同文件中以及上面提到的编译器只从上朝下编译且对每个文件仅编译一次。 编译器编译程序时,只会一个一个源文件编译,并分别转载 2012-12-06 10:56:40 · 431 阅读 · 0 评论 -
DEBUG_PRINT
在程序里为了调试的便利,我们经常要打印一些信息,如函数的返回值什么的,同时我们又不想在公布的法度中显示这些信息,于是我们如许实现:#ifdef _DEBUG printf("This is a debug information.\n");#endif 然则,在法度里为了调试的便利,我们经常要打印一些信息,如函数的返回值什么的,同时我转载 2012-08-27 16:25:22 · 880 阅读 · 0 评论 -
memcpy memmove区别和实现
memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中。但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开销。memmove的处理措施:(1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝(2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝(3)当源内存的首地址小于目标内存转载 2012-07-09 17:29:50 · 506 阅读 · 0 评论 -
嵌入式工程师C语言面试常见的0x10个问题
1、用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 要点:①#define语法的基本知识(例如:不能以分号结束、括号的使用,等等)②懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。转载 2012-07-06 00:07:45 · 619 阅读 · 0 评论 -
函数指针和指针函数
一 通常的函数调用一个通常的函数调用的例子: //自行包含头文件 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); int main(int argc, char* argv[]) { MyFun(10); //这里是调用MyFun(10);函数 return 0; } void MyFun(int转载 2012-07-05 15:21:21 · 576 阅读 · 0 评论 -
常见设计模式的解析和实现(C++)之九-Decorator模式
<br />作用:<br />动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator 模式相比生成子类更为灵活。<br /><br />UML结构图:<br /><br />抽象基类:<br />1)Component:定义一个对象接口,可以为这个接口动态的添加职责.<br />2)Decorator:维持一个指向Component的指针,并且有一个和Component一致的接口函数.<br /><br />接口函数:<br />1)Component::Operation:这个接口函数由C转载 2010-10-17 19:07:00 · 389 阅读 · 0 评论 -
常见设计模式的解析和实现(C++)之八-Composite模式
<br />作用:<br />将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。<br /><br />UML结构图:<br /><br />抽象基类:<br />1)Component:为组合中的对象声明接口,声明了类共有接口的缺省行为(如这里的Add,Remove,GetChild函数),声明一个接口函数可以访问Component的子组件.<br /><br />接口函数:<br />1)Component::Operatation:定义转载 2010-10-17 19:04:00 · 410 阅读 · 0 评论 -
C语言编译过程
<br /> 编译的概念:编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序。<br /> 编译的完整过程:C源程序-->预编译处理(.c)-->编译、优化程序(.s、.asm)-->汇编程序(.obj、.o、.a、.ko)-->链接程序(.exe、.elf、.axf等)<br /><br />1. 编译预处理<br /><br /> 读取c源程序,对其中的伪指令(以转载 2010-08-26 18:49:00 · 310 阅读 · 0 评论 -
MISRA--作为工业标准的C编程规范
<br />MISRA--作为工业标准的C编程规范<br /> MISRA (The Motor Industry Software Reliability Association 汽车工业软件可靠性联会) 是位于英国的一个跨国汽车工业协会,其成员包括了大部分欧美汽车生产商。其核心使命是为汽车工业提供服务和协助,帮助厂方开发安全的、高可靠性的嵌入式软件。这个组织最出名的成果是所谓的MISRA C Coding Standard,这一标准中包括了127条C语言编码标准,通常认为,如果能够完全遵守这些标准,则转载 2010-08-24 17:24:00 · 500 阅读 · 0 评论 -
C语言面向对象的实现
C语言面向对象的实现 <br />C++语言面向对象的编程是它的基本特点,在大型C语言编程中,如:Linux内核,面向对象的编程思想也得到了广泛的应用。 <br />C语言是面向过程的、结构化的编程;但也可应用面向对象的思想,把结构看作类,实现面向对象的编程,尽管结构与类有本质的不同。为理解方便,下面将用于面向对象编程的结构也称为类。 面向对象的编程思想 <br />面向对象是用软件系统直接对现实世界的直接模拟,将现实中的事物直接映射到软件系统中的类,使得软件与现实中的事物一样直观。 <br />对象是现实转载 2010-08-24 16:59:00 · 1137 阅读 · 0 评论 -
INF文件
INF是Device INFormation File的英文缩写,是Microsoft公司为硬件设备制造商发布其驱动程序推出的一种文件格式,INF文件中包含硬件设备的信息或脚本以控制硬件操作。在INF文件中指明了硬件驱动该如何安装到系统中,源文件在哪里、安装到哪一个文件夹中、怎样在注册表中加入自身相关信息等等。 安装监视器、调制解调器和打印机等设备所需的驱动程序,都是通过INF文件,正是INF的功劳才使得Windows可以找到这些硬件设备的驱动并正确安装。当我们通过“开始→控制面板→添加删除程序→Windo转载 2010-08-05 09:28:00 · 380 阅读 · 0 评论 -
BMP图象格式
简介位图文件(Bitmap-File,BMP)格式是Windows采用的图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式。Windows 3.0以前的BMP位图文件格式与显示设备有关,因此把它称为设备相关位图(device-dependent bitmap,DDB)文件格式。Windows 3.0以后的BMP位图文件格式与显示设备无关,因此把这种BMP位图文件格式称为设备无关位图(device-independent bitmap,DIB)格式,目的是为了让Windows能够在任转载 2010-07-22 09:59:00 · 459 阅读 · 0 评论