摘要: 1.虚拟内存,在32位平台下,一个进程一般拥有3g的虚拟内存地址,这些虚拟内存地址将包含,代码区,数据区,堆区,栈区等,事实上一个进程在初始化的时候,虚拟内存地址需要通过一个地址映射表才能转换为实际的物理地址,一个进程在初始化的时候操作系统不会为其分配很多的物理地址,当程序中有动态分配内存的请求时,操作系统会调整分配给进程的物理地址。2.malloc的原理:malloc是c的一个库函数,不同平台下有不同的实现,基本思想是,先看看当前进程的堆空间有没有够用的内存,有的话就返回,否则向操作系统要新的内存,此时会调用sbrk,brk,mmap等函数来实现,其中sbrk是对brk的封装也是属于c的库函 阅读全文
posted @ 2013-12-30 10:35 xpray 阅读(439) 评论(0) 推荐(0) 编辑
摘要: 1 class Human{ 2 } 3 4 class Man extends Human{ 5 } 6 7 class Woman extends Human{ 8 } 9 10 public class Test {11 12 void show(Human h) {13 System.out.println("Human");14 }15 16 void show(Man m) {17 System.out.println("Man");18 }19 2... 阅读全文
posted @ 2013-12-27 14:14 xpray 阅读(4863) 评论(0) 推荐(0) 编辑
摘要: 1 #include 2 #include 3 #include 4 5 int flag; 6 7 void fun(int signo) { 8 if (SIGINT == signo) { 9 printf("got SIGINT\n");10 flag++;11 }12 13 if (SIGQUIT == signo) {14 printf("got SIGQUIT\n");15 flag++;16 ... 阅读全文
posted @ 2013-12-27 10:32 xpray 阅读(722) 评论(0) 推荐(0) 编辑
摘要: 在c程序中,经常会遇到段错误(segment error)和总线错误(bus error),这两种问题出现的原因可能如下段错误:对一个NULL指针解引用。访问程序进程以外的内存空间。 实际上,第一个原因可以规约到第二个原因,在一个c程序的虚拟内存空间中,从低地址到高地址一次是代码区,堆区(向上增长),栈区(向下增长),最上是常量区,其中NULL指针的位置正好是虚拟内存中地址为0的位置,而这个位置是不属于以上4个区域的,同理一些比较低的地址也不属于这四个区,所以造成段错误的原因是访问了程序虚拟内存空间4个区以外的地址,在平时的开发中,最大的可能还是对NULL进行了解引用。总线错误对一个错误的起. 阅读全文
posted @ 2013-12-25 17:57 xpray 阅读(4519) 评论(0) 推荐(0) 编辑
摘要: 关于洗牌,就是随机且等概率的打乱原始的顺序,这里有一种比较好的方法,可以这么思考,有两个集合A,B,A是原始数据,每一次随机选取A中的一个元素,依次放到B中,那么最后A为空,B的顺序就对应了一次洗牌,具体的实现不需要两个数组,首先从A的1...n的范围内选一个数与A[1]交换,然后从2..n中选一个数与A[2]交换..这样就相当于把每一次选中的数字放到了B里面,而且下一次选择的时候一定不会选到之前出现的数字了,所以代码如下:1 void suffle(int n)2 {3 for(int i=1;i<=n;i++)4 {5 int ... 阅读全文
posted @ 2012-09-17 22:32 xpray 阅读(209) 评论(0) 推荐(0) 编辑