
C/C++
iefswang
Just for memory
展开
-
(转)C++中extern “C”含义深层探索
(转)C++中extern “C”含义深层探索 1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计转载 2012-03-13 21:44:12 · 523 阅读 · 0 评论 -
ACM编程题
1.a+b问题#include int main(){int a,b;while(scanf("%d%d\n",&a,&b)!=EOF){printf("%d\n",a+b);}return 0;}原创 2013-08-19 20:38:05 · 658 阅读 · 0 评论 -
进程内存布局
内存管理是操作系统的核心之一,最近在研究内核的内存管理以及 C 运行时库对内存的分配和管理,涉及到进程在内存的布局,在此对进程的内存布局做一下总结: 1. 32 位模式下的 linux 内存布局图上的各个部分描述得比较清楚,不需再做过多的描述。从上图可以看到,栈至顶向下扩展,并且栈是有界的。堆至底向上扩展, mmap 映射区域至顶向下扩展,mmap 映射区域和堆相对转载 2013-08-25 21:27:36 · 649 阅读 · 0 评论 -
段错误
3。编程中通常碰到段错误的地方有哪些?为了进行下面的实验,我们需要准备两个工具,一个是gcc,一个是gdb我是在ubuntu下做的实验,安装这两个东西是比较简单的Quote:sudo apt-get install gcc-4.0 libc6-devsudo apt-get install gdb好了,开始进入我们的实验,我们粗略的分一下类转载 2013-08-26 22:22:29 · 3029 阅读 · 0 评论 -
编程小技巧
1.如何通过输入一组任意长度的数字序列?char inchar[N];int num[N];int i=0;int len=0;scanf("%s",inchar);len = strlen(inchar);printf("len:%d",len);for(i=0;i{num[i]=inchar[i]-'0';}原创 2013-08-16 21:48:08 · 642 阅读 · 0 评论 -
华为面试-总结
1.判断回文序列#include #include #include #define N 100int main(){char inchar[N];int num[N];int i=0;int j=0;int len=0;scanf("%s",inchar);len = strlen(inchar);printf("len:%原创 2013-08-18 12:09:33 · 963 阅读 · 0 评论 -
进程内存布局中各段存放内容
BSS段(bsssegment)通常是指用来存放程序中未初始化的全局变量和静态变量(全局和局部)的一块内存区域。BSS是英文BlockStarted by Symbol的简称。BSS段属于静态内存分配。data段:数据段(datasegment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。text段:代码段(codesegment原创 2013-09-04 22:14:45 · 1676 阅读 · 0 评论 -
柔性数组
处理二进制协议时,过去常用的方法是,只定义协议头,或者用char data[1]定义协议体只定义协议头不够直观,需要计算协议体地址;而data[1]需要进行类型转换,其实也是计算协议体地址现在发现有一种更“优雅”的方法:柔性数组,可以这样定义:struct protocol{ uint32_t len; uint32_t type; uin原创 2013-09-06 15:40:39 · 689 阅读 · 0 评论 -
C变长参数问题--如printf
在中定义了相关处理变长参数的宏va_start,va_arg,va_end。typedef char * va_list;#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) /*整数边界对齐*/#define va_start(ap,v) ( ap = (va_原创 2013-09-07 13:44:27 · 1093 阅读 · 0 评论 -
嵌入式面试题的一些答案
嵌入式面试题这部分是ANSI C的一些问题,题目的前提是必须都答对,看似很变态,但是细想一下,这些都是最基础的,虽然我们在使用他们的时候会犯这样那样的错误,但是最终目的是不犯错误,不是么,那么好,从最基础的开始。1、 如何在C中初始化一个字符数组。这个问题看似很简单,但是我们要将最简单的问题用最严谨的态度来对待。关键的地方:初始化、字符型、数组。最简单的方法是char array[转载 2013-09-07 20:58:52 · 1447 阅读 · 0 评论 -
嵌入式面试题
一、ANSI C/C++方面的知识一.1、简答题。下面的题目必须全部答对才给分(20分):1、 如何在C中初始化一个字符数组。2、 如何在C中为一个数组分配空间。3、 如何初始化一个指针数组。4、 如何定义一个有10个元素的整数型指针数组。5、 s[10]的另外一种表达方式是什么。6、 GCC3.2.2版本中支持哪几种编程语言。7、 要使用CHAR_BIT需要包含哪个头转载 2013-09-07 16:41:34 · 1862 阅读 · 0 评论 -
typedef与typeof
typedef作用: 给一个数据类型起一个别名。使得编程时较简单规范。其中有一点需要注意,如typedef char* pstr2;char string[4];const char * pstr1=string;const pstr2=string;pstr1++;pstr2++;这里会在pstr2++处报错。原因是pstr2是const类型,不能进原创 2013-09-04 17:21:09 · 3937 阅读 · 0 评论 -
strcpy和memcpy的区别
strcpy和memcpy都是标准C库函数,它们有下面的特点。strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。已知strcpy函数的原型是:char* strcpy(char* dest, const char* src);memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。转载 2014-03-30 08:01:32 · 613 阅读 · 0 评论 -
备忘知识
1.minGW: 提供了简便的windows下的基于gcc程序开发环境。minGW收集了一系列免费的windows使用的头文件和库文件;同时整合了GNU的工具集,特别是GNU程序开发工具,如经典的gcc、g++、make等。minGW完全免费,在windows平台上模拟了linux下GCC开发环境,为C++的跨平台开发提供了良好的基础支持。2. DJGPP:在WINDOWS平台下,我们一般用V原创 2012-09-03 23:03:55 · 515 阅读 · 0 评论 -
如何打印函数指针的函数名-总结
在内核调试时,我们需要跟踪函数调用过程,在这时,原创 2014-05-07 17:17:00 · 16696 阅读 · 0 评论 -
c89与c99区别
注: GCC支持C99, 通过 --std=c99 命令行参数开启,如: 代码:gcc --std=c99 test.c -------------------------------------------------------------------------------------------------- 1、增加restrict指针 C99中增加转载 2013-01-13 23:17:43 · 8687 阅读 · 0 评论 -
C语言一些注意的地方
1. ##的作用是将字符串连接在一起。如 #define IRQ(x,y) IRQ##y##_interrupt原创 2012-09-03 21:24:50 · 676 阅读 · 0 评论 -
C语言程序的内存布局
网站参考:http://tieba.baidu.com/p/1344477358 一、C语言程序的内存布局 C语言目标文件的内存布局看一个例子: int a = 0; //全局初始化区,。data段 static int b=20; //全局初始化区,。data段char *p1; //全局未初始化区 .bss段 const int A = 10转载 2012-05-20 17:04:44 · 574 阅读 · 0 评论 -
exit()与atexit()
1. exit()函数:void exit(int state); 用于在程序运行的过程中随时结束程序,exit的参数state是返回给操作系统,返回0表示程序正常结束,非0表示程序非正常结束。 一个函数中都可以调用exit(),main函数结束时也会隐式地调用exit函数。exit()函数工作过程: 首先会执行由atexit()函数登记的原创 2012-04-06 09:11:30 · 1228 阅读 · 0 评论 -
ioctl相关知识
【转】ioctl相关知识 (略有修改) 一、 什么是ioctl ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。它的调用个数如下: int ioctl(int fd, ind cmd, …);其中fd就是用户程序打开设备时使用open函数返回的文件标示符,cmd就转载 2012-04-06 10:16:26 · 443 阅读 · 0 评论 -
linux蜂鸣器测试程序
必要的头文件#include //必要的头文件#include //POSIX终端控制定义#include #include #define PWM_IOCTL_SET_FREQ 1#define PWM_IOCTL_STOP 0#define ESC_KEY 0x1b //定义ESC_KEY 为ESC按键的键值转载 2012-04-06 22:10:06 · 4935 阅读 · 1 评论 -
C++虚函数表解析(转)
C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。关于虚函数的使用方法,我在这里不做过多的转载 2012-04-12 15:29:08 · 618 阅读 · 0 评论 -
构造函数与析构函数的作用【转】
构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数。不建议在构造函数和析构函数里面调用虚函数。构造函数不能声明为虚函数的原因是: 解释一:所谓虚函数就是多态情况下只执行一个。而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象。如果构造函数设为虚函数,那么当你在构造父类的构造函数时就不得不显示的调用构造。还有一个原因就是为了防错,试想如果你在子类中一转载 2012-04-12 16:35:00 · 4842 阅读 · 0 评论 -
常引用、静态常变量的例子
一个常引用、静态常变量的例子:#include using namespace std; class B{public: B(int i):y(i),x(y){ }; static void f() {cout void handler() { cout const int &x; //公有成员变量private: const int y;原创 2012-04-13 16:11:36 · 860 阅读 · 0 评论 -
组合
组合 若在逻辑上A 是B 的“一部分”(a part of),则不允许B 从A 派生,而是要用A 和其它东西组合出B。例如眼(Eye)、鼻(Nose)、口(Mouth)、耳(Ear)是头(Head)的一部分,所以类Head 应该由类Eye、Nose、Mouth、Ear 组合而成,不是派生而成。class Eye{public:void Look(void);转载 2012-04-13 22:21:02 · 456 阅读 · 0 评论 -
虚函数表指针和虚继承
当一个类中存在虚函数,则在该类实例化后,在类的开始处存放一个指针,虚函数表指针,指向虚函数地址的指针。大小为4字节。而不是在类开始处存放多个虚函数的地址。下面是实验的例子:#include using namespace std;class A{public: virtual void f() {cout virtual void d(){};private: in原创 2012-04-12 17:12:57 · 1437 阅读 · 0 评论 -
C++、C#中 abstract 与 virtual关键字的区别联系
C++: C++中,由virtual实现多态。除多态外,virtual有两个特殊用法:1、虚基类(Virtual base class) 为解决多重继承时的二义性提出来的。使用方法:class B :virtual public A class C :virtual public Aclass D: public B, public C Abstract原创 2012-04-30 21:01:33 · 16569 阅读 · 1 评论 -
printf的重入问题及解决方法
一、可重入函数 1)什么是可重入性? 可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误。相反, 不可重入(non-reentrant)函数不能由超过一个任务所共享。可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据。 2)可重入函数: 不为连续的调用持有静态数据。不返回指向静态数据的指针;所有数据都由函数的调用者提供。转载 2012-04-30 08:52:28 · 7068 阅读 · 0 评论 -
static关键字用法小结【转帖】
static关键字是C, C++中都存在的关键字, 它主要有三种使用方式, 其中前两种只指在C语言中使用, 第三种在C++中使用(C,C++中具体细微操作不尽相同, 本文以C++为准). (1)局部静态变量 (2)外部静态变量/函数 (3)静态数据成员/成员函数 下面就这三种使用方式及注意事项分别说明 一、局部静态变量 在C/C++中, 局部变量按转载 2012-04-18 14:43:19 · 437 阅读 · 0 评论 -
易混淆的概念
1、数据存储方式 大端(内存高地址存放数据低位);小端(内存高地址存放数据高位)那指令在内存中的存放顺序又是如何?指令在内存中是按顺序存放的,不论是在大端存储,还是小端存储。因为顺序执行程序时,PC自动更新为PC+1。所以在小端存储的CPU中,指令的操作码在在内存中是按顺序存放,而操作数则是按小端存储的。例如原创 2012-06-04 21:22:55 · 802 阅读 · 0 评论 -
pragma 预处理指令详解 [转帖]
在所有的预处理指令中,#pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。 其格式一般为: #pragma para 其中par转载 2012-05-17 08:42:21 · 784 阅读 · 0 评论 -
sizeof的个人总结
sizeof是计算变量、指针、数组、结构体、联合体等数据类型或对象(c++)所占内存的大小。变量、指针较容易。数组sizeof计算时,注意字符型的数组包括末尾的结束符'\0',因为也占用了内存空间。char * p[10]="1234";sizeof(p)=10分配的字符串空间为10.strlen是计算数组中已经用了的空间长度。strlen(p)=4 1、结构体原创 2012-05-19 15:53:59 · 836 阅读 · 0 评论 -
const关键字的深入理解
王海宁,华清远见嵌入式学院讲师,对const关键字的理解 http://www.embedu.org/Column/Column311.htm 目前在进行C语言补习时,发现很多的同学对于const这个关键字的理解存在很大的误解。现在总结下对这个关键字理解上的误区,希望在以后的编程中,能够灵活使用const这个关键字。1、 const修饰的变量是常量还是变量转载 2012-05-20 15:54:37 · 493 阅读 · 0 评论 -
星星之火
1、__FILE__ __FUNCTION__ __LINE__ 他们是C语言中非常有用的全局变量,用于代码定位。__FILE__代码当前所在的文件名。字符串__FUNCTION__:当前所处的函数名。字符串 __LINE__当前所处的 行号。整型实验:结果: 2、%p 用法:char * ptr;printf("%p",ptr);原创 2012-04-26 16:00:35 · 832 阅读 · 0 评论