51CTO博客开发
既然是开篇后的第一篇,就先来一个简单且实用的函数吧,以增强你我的信心,然后再一步一步到复杂,这样从前至后,也就很顺其自然了。 还记得初学C的时候,对于字符串操作一类函数的记忆显得尤为深刻,各种考试会考strlen、strlen等函数的实现,到了毕业找工作,很多公司的笔试题里
在本博客开启时,就有打算写这块的冲动,直到现在,直到今晚,突然一股劲让我开了这个系列,写下开篇。 近段时间一直忙于工作,潜下心来做自己的研究也少了很多,每天下班回家都10点多了,很累。一般就洗洗睡觉了,远远比不得几年前的精力和状态了。看来我得好好调整一下时间,让时间用在刀刃上。 &nb
很多时候,我都会想,人活着到底是为了什么?为了名利?为了生活?为了追求?为了责任?或者就为了简简单单的活着? 这个问题可能会将很多人给问住了,可能在你活了十多年,甚至活了几十年都不知道这一辈子到底是为了什么而活着。有时候觉得多读一些书是好事,有时候又觉得少读一些书未必是件坏事,有很多人学识见识都比较低,他们想得比较简单,人活着就是为了活着,不为别的,能吃饱饭,能在某
哎,下班回家就开始大扫除,一直到凌晨才搞定,真的累了。但是计划的是今天必须将本文写完,不写完睡不着觉。那就尽快切入正题吧! 我们经常使用malloc或者new等函数或操作符来动态分配内存,这里的内存说的是堆内存,并且需要程序员手工释放分配的内存。malloc对应free,ne
工作3年之余,发现精力会随着很多事情而降低,以前觉得很有激情很有兴趣的东西,可能会慢慢变得“无关紧要”了。不知道这是一种所谓的洒脱,还是一种懈怠。总之我会努力克服现在的状态,让自己的业余时间再充分利用起来。加上最近得了一个“准专家徽章”,为了对得起这个徽章,也为了摆脱前面的懈怠,我要坚持写下去。 &n
哎,几个月以来没有写博客了,时间太紧,精力又有限。今天正好有这个时间,打算写一篇今天在网上讨论的一个问题。 我想大家应该都听过“国际C语言混乱代码大赛(IOCCC, The International Obfuscated C Code Contest)”吧,今天无意间在网上讨论到这个问题。我有意将main函数改变了一下,居然编译通过了,于是想利用这个特性,写
前面已经写过两次inline hook的博文了,第一篇为:《C/C++ HOOK API(原理深入剖析之-LoadLibraryA)》,这篇博文的方法是通过修改任意函数的前面N个字节,实现跳转并进入到我们自定义的hook函数里,执行完毕我们的hook函数之后,再直接调用被hook的函数。第一篇的方法没有考虑多线程的情况,所以在多线程环境下会有问题。第二篇为:《Inline HOOK A
差不多已经有3个月没有更新博客了,不知道都忙什么去了。我一直以来有一个不知道什么时候开始有的准则,要写博文就得写好,在每次的写作中应该总结上次的一些写法,弥补一些不足,同时要看到进步。所以在这3个月期间做了很多次打算要写本篇的,可总是被一些事和当时的心情所影响,为了追求质量,因此跳票到现在了,在此跟大家说声对不起。之前的一个月一篇的承诺没有实现,以后改正。 好了,回到
自从开始工作,就感觉精力相比在大学时有很大幅度的下降。大二那一年精力最旺盛,自从大二结束开始工作到现在,两年时间,似乎精力都已经不受自己控制了。如果对一些技术研究工作不是很感兴趣,下班之后基本上到晚上10点左右就想睡觉。工作两年加上大二的一年,一直到现在都坚持每天必须有新的东西进入脑子,进步倒是明显感受到了,但真担心现在的精力还能坚持几年的技术研究。但愿不要像大家说的到了30岁以后就不
之前一直徘徊第一篇该写哪一种设计模式,最后决定还是以Singleton模式开始吧。之所以以它开始,原因在我于个人认为,相对来说它在设计上比较单一,比较简单一些。在通常情况下,它是最容易理解的。同样也正因为它容易理解,细节才更值得注意,越是简单的东西,往往会被我们忽略一些细节。关于Singleton模式的讨论和实现也非常的多,GOF设计模式也只对它进行了简单的描述,本文则打算相对全面的介
时间过得真快,距离连载完【C/C++语言入门篇】已经6个月之久了。感谢长期以来支持我的朋友们,同时也感谢路过批评与建议的朋友们,如果没有你们,我想我将没有收获,也将没有信心坚持在这里。 近两个月一直忙着各种事情,加之要将本质工作做好,写博的时间基本都抽不出来了。有的时候想写,但又似乎提不起精神,比起两年前大二时期的精力,简直就没得比。虽然不知道这个系列是否能够有足够的时间写完,但
就毕业了。。 终于毕业了。。 就这样毕业了。。 哎!已经毕业了。。 在2010年6月29日,也就是我农历生日的前一天,大学毕业了!!我不知道是不是上天故意要安排在这天毕业,也不知道到底这样的巧合有什么样的意义,我只知道此刻起我的学生身份将不再有了,好像还在怀念以学生自居的感觉。不是因为车票可以打折,不是因为景点门票可以优惠,那是为了什么? 有句话说:“毕业等于失业
记得在之前写过一篇hook api的文章(C/C++ HOOK API(原理深入剖析之-LoadLibraryA),那篇文章主要原理是构造一块代码字节,将LoadLibraryA函数的前面16个字节给修改,然后跳转到自定义的函数中。要调用正常的函数时,又将其unHook,这样一来再一次调用中,有一次unhook和一次hook,操作显得过于频繁。而且hook与unhook当时设计成了th
最近一直忙毕业的相关事情,加上工作,转眼间,又到月底了,之前承诺的每月一篇博文,前几天就一直在寻找到底要写什么,近两天又突然发现有很多东西可以写。本篇就先延续之前的一篇基于Cookie的安全检查机制(深入C/C++之基于Cookie的安全检查(VS2005)来介绍下另外一种在DEBUG版本下的安全检查,也就是CheckStackVars检查,话不多说,直接进入正题。
转眼间有过了一个月了,自从【C/C++语言入门篇】连载结束后,已经很久没有写博了。最近一直忙着本科毕业论文和工作上的任务,加上一个对于我来说非常重要的事情正在进行中。所以近段时间脑子一直处于绷紧状态,发现自己的脑细胞还真是不够用。加油! 今天有朋友问到一个问题,那就是在C++的多重继承中,出现菱形状继承的情况下,在构造对象时的内存分布及构造函数的调用流程上
好了,写了这么几个文件后,再看看怎么把他们从包里面弄出来,然后能够正常的打开和查看: int main( void ) { byte* pBuff; &n
二、读写字符串 C语言为从文件中读写字符串提供了2个函数: char* __cdecl fgets( char* _Buf, int _MaxCount, FILE* _File ); 参数一:要从文件中读入字符串的存放空间。 参数二:最大读取字节数。 参数三:文件指针。 返回值:返回读入的字符串指针。 int  
最近实在是太忙了,这篇整整就推迟了1个月了,实在是对不起。之前本打算这个模块就结束了,文件操作就不写了,但是文件操作又是一个很重要的东西,而且也刚好能够总结之前我们学习的所有知识。同时也为了将文件操作这个初学者认为很神秘的东西给本质化。因此,本篇将逐一介绍C语言的文件操作。(本模块的命名本来是想C/C++一块儿讲解的,但是由于工作、毕业论文、业余时间的充电、还有要完成那个未知的梦等
前面一篇我们讲了位运算后,基本C语言的大块都提及了,一些细节和用法暂时不再本模块介绍了。希望我的心愿能够在我毕业之前给我的大学生涯划上一个圆满的句号。加油努力。 在本模块的第三篇就已经讲了基本的数据类型,其中把浮点数刻意留在了后面来介绍。我的理解是在我们理解了内存,指针,位运算等后,再来介绍浮点这个特殊而又普通的数据类型比较好理解。浮点数和基本类型数据的存储差别比较大
了解了上面的几个运算符,下面介绍剩下的两个:按位取反和按位异或。 在实际的工作中,通常会有一些状态需要表示。我们这些状态又想节约一点空间。于是我们选择了用一个32位的无符号整数来存放这些状态。比如: 在游戏里面,某个玩家的一些状态也就是我们经常说的BUFF,比如:持续加血,持续加蓝,持续加体力,经脉受伤,被点穴等等。于是我们就有一个枚举: enum EPLAYER
回顾之前的篇幅,C语言的主体部分基本已经介绍完了。之所以没有介绍C++的相关特性是因为在之前的文章中C和C++在这些方面都有共性,所以在面向对象之前。我们先把这些共性给介绍完。也就是说在介绍面向对象之前,所有的文章都是CC++中都能使用的。从这点上来看,现在正极力奋斗于C++战线上的初学者还是很有用处的。 本篇继续沿着这条路线,到本篇为止包括本篇都还不会急于去介绍C+
好了。返回值我们就说完了。下面说参数。 参数可以有多个,还可以有不定参数,比如我们常用的printf函数就是不定参数。也就是动态的参数个数哈。 固定的参数个数多个和一个是一样的道理,我在这里只列举一个参数的情况或者两个参数的情况。 void fun( int* p ); void fun( int a ); void fun( void );
前面一篇我们介绍了结构体,这篇终于能够介绍函数了。为什么这么说呢?因为函数非常重要。就这么简单。嘿嘿!之所以在这时才讲函数,是因为本篇将联系到前面的每一篇,这样函数才能体现的透彻。那我们就迫不及待的切入正题。 从第一篇Helloworld开始到现在,就没有脱离函数。那就是我们的main函数。main函数也是一个普通的函数,只不过通常把它作为我们写的程序的入口。也就是说
前面两篇基本把指针给介绍完了,相信大家对指针已经不是那么陌生了。也不会因为指针和数组之间的关系而导致混淆了。大家可能也迫不及待想了解下后来的知识。今天我们就介绍下结构体。 对于结构体,既然叫结构体,形象上我们可以理解其就是一堆数据集合在一起形成一个结构。就比如一个学生的信息包括:学号、姓名、班级、年龄等等。这些信息都是属于这个学生的,因此我们就可以将这些信息统一绑定在
前面一篇我们介绍了指针,相信大家对指针不再是那么陌生,虽然在一些大胆的指针强制类型转换上有的读者还不习惯。但是至少大家心里有个数,指针式如此的灵活,以至于你可以操作得比较底层或者根本越过一些语法的限制。这可能也是众多程序员抨击CC++不安全的因素之一。安不安全不是本文想要表达的,这里只需要记住一点,如果你有足够把握,那么你绝对可以毫不犹豫的运用。 本文依然不会离开指针
再上一篇,我们介绍了基本调试。之前也说了,之所以把调试放在前面讲是因为后面的文章基本都会用到调试。观察我们的程序到底发生了什么。让我们能够直接明了的看清楚问题的本质。本篇将深入一点介绍指针这个让无数初学者畏惧的东西。希望大家再看完本篇之后能对指针有新的认识,之后不再惧怕它。觉得它就那么回事。那下面我们就努力攻克这个令我们“惧怕”的东西。 我们可
通过前面两篇,相信大家已经基本了解了我们的研究思路。既然是研究,那么必须的研究工具就得熟练掌握了。这里我所指的研究工具就是VC,我所使用的VC版本是2005。本文也将根据VC2005进行探讨。可能很多朋友或者初学者还是使用的VC6.0。在这里本人不推荐使用VC6.0。原因很简单,VC6.0已经过时了,后面的版本比VC6.0更强大方便。可能也是因为众多经典的程序设计书籍使用的都是VC6.0。有的朋友
前一篇我们介绍了一个简单不过的helloworld程序引出相关问题。趁着还没有忘掉那些思考方式的记忆,本篇继续延续这种思维方式的理念,介绍一下CC++中的基本数据类型。数据类型不清楚的话在以后的编程中会有很多谜团和问题。甚至一个程序的BUG找半天也没有找出来时为什么,结果才发现是加减溢出了。更加严重的还有写越界、读越界等。同样比如网络传输时的消息结构对待每个字节,每个成员的大小及类型都
第一篇文章终于落笔了,本文将从思考的角度去重新认识一下Helloworld。在例子之后会提出不同的问题,引导大家去思考每一句乃至每个细节。同时希望能够让大家以后能够以不断思考不断提问的方式去看待自己的程序。我相信大家会发现很多新的东西,好了切入正题。 我们每学一种新的语言基本都会从helloworld开始,基本每种语言都喜欢将helloworld作为示例直接的表现在读
Copyright © 2005-2023 51CTO.COM 版权所有 京ICP证060544号