- 博客(13)
- 资源 (3)
- 收藏
- 关注
转载 new和malloc
我们知道,使用malloc/calloc等分配内存的函数时,一定要检查其返回值是否为“空指针”(亦即是检查分配内存的操作是否成功),这是良好的编程习惯,也是编写可靠程序所必需的。但是,如果你简单的把这一招应用到new上,那就不一定正确了。我经常看到类似这样的代码: int* p = new int[SIZE]; if(p==0) //检查p是否空指针
2016-01-28 16:38:39 245
原创 随机洗牌
随机洗牌有多种思路:1、抽牌法#define NUM 54void Shuffle(){ int card[NUM]; for (int i = 0; i < NUM; i++) { card[i] = i+1; } for (int i = NUM-1; i >= 0; i--) { int n = rand() % (i+1); int num = card
2016-01-28 15:12:16 533
原创 汉诺塔
汉诺塔问题可以有几种解决方法:一、递归递归方式是最简单的也是最容易想到的一种方式。假如n个圆盘要从a 移动到 b,则需要分三步:1、最上面n-1个圆盘从a先移动到c 2、最后一个圆盘从a移动到b3、n-1个圆盘从c移动到bvoid move(int n, char cSrc, char cDest, char cMid){ if (1 == n) { print
2016-01-28 14:08:18 436
原创 C语言笔记
1、C语言动态内存char *pStr = (char*)malloc(sizeof(char)*10);memset(pStr, 0, 10*sizeof(char));malloc和memset一般是一起使用的,malloc分配的内存是不进行初始化的,如果不用memset初始化在进行右值操作时很有可能出现错误。若申请了两段内存空间pStr1和pStr2,当pStr = p
2016-01-27 12:35:43 317
原创 Git使用
Git是什么?Git是目前世界上最先进的分布式版本控制系统(没有之一)。是程序版本控制的好帮手。有了它你就可以把别人忙于版本保存修改的时间用来喝茶什么的。Git是怎么产生的呢?话说以前是没有Git的(废话。。),大多数的版本控制系统是收费的,与之相冲突的就是开源了。当时Linux就是属于开源这一类。当时Linux系统就是用BitKeeper的商业版本控制系统,但是出于人道主义的考虑,允
2016-01-26 17:01:20 379
原创 加壳实现
学习了PE文件结构一段时间了,于是想写一个简单的壳更好的掌握所学的内容。一、加壳思路加壳软件一般要编写两部分内容(加壳软件和壳软件),目的是把壳软件附加到要保护的可执行文件里面实现一些目的。目前而言壳软件用dll来实现是比较简单的方式,当然也可以用其他的方式。加壳软件:(只增加一个段的实现方式)1>加载要被加壳的文件,并分析其PE结构。2>加载DLL到内存,并分析其PE结构,得
2016-01-19 11:45:54 3576 3
原创 Kernel32加载地址查找的基本方法
搜索内存中的API有许多方法,主要的是要找到KERNEL32.DLL的加载地址,常用的基本方法也就几种。一、通过线程初始化时压入堆栈的ExitThread的地址来得到KERNEL32.DLL的地址。二、通过SEH异常链表三、通过TEB得到PEB结构的地址
2016-01-13 12:54:55 1743
原创 代码重定位
重定位就是把程序的逻辑地址空间变换成内存中的实际物理地址空间的过程,也就是说在装入时对目标程序中指令和数据的修改过程。为什么需要重定位?程序员在编写程序时,在使用某些常量、全局变量时,编译器把这些数据的地址编译成一个绝对地址(比如:call 0x400100),是以ImageBase(0x400000)为基准。当程序加载到ImageBase时,程序正常运行,可是当程序加载地址为0x5000
2016-01-12 08:49:15 1769
转载 CreateFileMapping、MapViewOfFile
CreateFileMapping的MSDN翻译和使用心得 测试创建和打开文件映射的时候老是得到"句柄无效"的错误, 仔细看了MSDN以后才发觉是函数认识不透, 这里把相关的解释翻译出来HANDLE CreateFileMapping( HANDLE hFile, //物理文件句柄 LPSECURITY_ATTRIBUTES
2016-01-11 09:10:47 550
转载 线程本地存储TLS(Thread Local Storage)的原理和实现——分类和原理
本文为线程本地存储TLS系列之分类和原理。一、TLS简述和分类我们知道在一个进程中,所有线程是共享同一个地址空间的。所以,如果一个变量是全局的或者是静态的,那么所有线程访问的是同一份,如果某一个线程对其进行了修改,也就会影响到其他所有的线程。不过我们可能并不希望这样,所以更多的推荐用基于堆栈的自动变量或函数参数来访问数据,因为基于堆栈的变量总是和特定的线程相联系的。不过如果
2016-01-09 08:45:03 327
转载 WM_CREATE和WM_INITDIALOG
首先引入网上搜索到的关于这两个消息比较靠谱的区别: 在响应WM_CREATE消息响应函数的时候,对话框及子控件还未创建完成,亦是说只是通知系统说要开始创建窗口啦,这个消息响应完之后,对话框和子控件才开始创建。因此在此消息响应函数中无法对控件进行修改和初始化。 而WM_INITDIALOG消息响应函数是在程序运行时,当其对话框和子控件全部创建完毕,将要显示内容的时候发送的消息。
2016-01-08 11:30:42 646
转载 Windows32编程一些问题
Windows32编程一些问题1. 系统何时发送WM_PAINT消息? 系统会在多个不同的时机发送 WM_PAINT 消息:当第一次创建一个窗口时,当改变窗口的大小时,当把窗口从另一个窗口背后移出时,当最大化或最小化窗口时,等等,这些动作都是由系统管理的,应用只是被动地接收该消息,在消息处理函数中进行绘制操作;大多数的时候应用也需要能够主动引发窗口中的绘制操作,比如当窗口
2016-01-08 11:07:24 414
转载 Unicode 与 ANSI 字符串转换
如果你经常在 Windows 平台下写程序的话,我相信你一定会遇到 Unicode 与 ANSI 字符串之间的转换(string CString之类的)。要想实现 Unicode 和 ANSI 之间的转换,我之前的一篇文章中简单的介绍了一下:VS 系列 CString 转 string 方法,其实文中的方法是我蒙出来的,简单有效,至于原理我也不甚明了。大部分人使用的是以下两种
2016-01-07 08:51:45 568
linux内核源码V0.12
2014-07-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人