2013年4月21日

摘要: 1、启动运行时类型识别RTTI 使用dynamic_cast就必须在编译器中启动RTTI,即“运行时期类型识别”。默认情况下编译器是不启动RTTI的。凡是程序中用到了RTTI(比如typeid)都要在编译器中打开RTTI,这样才能正确编译。 VC6下启动RTTI:Project->settings->c/c++->category->c++ language,将Enable Run-Time Type Infomation(RTTI)选中,或者直接使用/GR编译选项。 阅读全文
posted @ 2013-04-21 09:18 江在路上 阅读(132) 评论(0) 推荐(0) 编辑

2013年4月20日

摘要: char是C/C++整型数据中比较古怪的一个,其它的如int/long/short等不指定signed/unsigned时都默认是signed,但char在标准中是unsigned,编译器可以实现为带符号的,也可以实现为不带符号的,有些编译器如pSOS的编译器,还可以通过编译开关来指定它是有符号数还是无符号数。 ANSI C 提供了3种字符类型,分别是char、signed char、unsigned char。char相当于signed char或者unsigned char,但是这取决于编译器!这三种字符类型都是按照1个字节存储的,可以保存256个不同的值。signed char取... 阅读全文
posted @ 2013-04-20 20:50 江在路上 阅读(176) 评论(0) 推荐(0) 编辑

2013年4月18日

摘要: 今天在网上看到了这样一个问题,“如果malloc 了一块字符串的内存,然后,它改变了这个字符串的大小,问会不会有一部分内存没有被释放掉。”这个问题,以前的确没有仔细想过。 当然,我觉得是肯定会释放掉的,但是一直没有了解过free 的原理,不敢乱说。我看了一下操作系统的内存管理,基本上是这样的,当然各个系统的实现不一样。 操作系统管理内存,维护了一个空闲内存链表,malloc从个链表中选出一个来使用,每个内存块都有一个头部来表示这个内存的基本信息,如内存大小, 所以free 时候 能够记住原来指针所指的内存大小,而不是用内存块中是否有 \0 来临时计算指向内存的大小,不要字符串的计算... 阅读全文
posted @ 2013-04-18 14:25 江在路上 阅读(191) 评论(0) 推荐(0) 编辑
 
摘要: 一、定义 “野指针”不是NULL指针,是指向“垃圾”内存(不可用内存)的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if无法判断一个指针是正常指针还是“野指针”。有个良好的编程习惯是避免“野指针”的唯一方法。二、成因 1、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。 2、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字(尤其是... 阅读全文
posted @ 2013-04-18 14:21 江在路上 阅读(209) 评论(0) 推荐(0) 编辑

2013年4月17日

摘要: 这个应该是我理解的最透彻的一次啦#include <stdio.h>union _data{ struct _test { int i:1; int j:2; int k:13; }test; int n;}data;int main (){ data.n = 0x1234; printf("%x\n", data.test.i); //0 printf("%x\n", data.test.j); //fffffffe printf("%x\n", data.test.k); //246... 阅读全文
posted @ 2013-04-17 22:47 江在路上 阅读(152) 评论(0) 推荐(0) 编辑
 
摘要: 1、#include <stdio.h>#include <stdlib.h>#include <string.h>int main(int argc, char** argv){ union { struct { unsigned char a:1; unsigned char b:2; unsigned char c:3; }d; unsigned char e; } f; f.e = 1; printf("%d\n",f.d.a); ... 阅读全文
posted @ 2013-04-17 20:45 江在路上 阅读(146) 评论(0) 推荐(0) 编辑
 
摘要: 位域类型对齐如果相邻的位域字段的类型不同,在不同的位域类型间,按通用的对齐规则进行不同数据类型间的对齐(注意,struct的长度是其内部最宽类型的整数倍)。如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式(不同位域字段存放在不同的位域类型字节中),Dev-C++和GCC都采取压缩方式;1、struct bs{ unsigned a:4; char b:4 ; unsigned c:4;}data;//占12个字节2、#include<stdio.h>typedef unsigned int uint32_t; void inet_ntoa(u... 阅读全文
posted @ 2013-04-17 20:33 江在路上 阅读(139) 评论(0) 推荐(0) 编辑
 
摘要: #include<stdio.h>struct _node{ int a; int b;};void test(int a,int b){ int c=1; int d=1; struct _node node; node.a=1; node.b=2; printf("b: %p\n", &b); printf("a: %p\n", &a); printf("c: %p\n", &c); printf("d: %p\n", &d); printf("node: 阅读全文
posted @ 2013-04-17 16:26 江在路上 阅读(153) 评论(0) 推荐(0) 编辑
 
摘要: 一、定义 位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几 个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。二、例子1、struct bs{ int a:8; int b:2; int c:6;}data;//说明data为bs变量,共占2个字节。其中位域a占... 阅读全文
posted @ 2013-04-17 15:01 江在路上 阅读(213) 评论(0) 推荐(0) 编辑
 
摘要: 转载:http://blog.csdn.net/africahyena/article/details/1525393从union的sizeof问题看cpu的对界 考虑下面问题:(默认对齐方式)union u{ double a; int b;};union u2{ char a[13]; int b;};union u3{ char a[13]; char b;};cout<<sizeof(u)<<endl; // 8cout<<sizeof(u2)<<endl; // 16cout<<sizeof(u3)<<endl; 阅读全文
posted @ 2013-04-17 13:57 江在路上 阅读(176) 评论(0) 推荐(0) 编辑