摘要: 找工作前写了篇blog说要做些常见的笔试面试题,像单链表反转啊字符串反转啊之类的题目,但是只写了一篇单链表反转就没再继续写下去,因为觉得实在没什么好写的,不过都是一些简单的指针操作罢了,但是还是有很多新手问这个问题,而且我在腾讯二面的时候也被要求实现这个函数,那我也写一篇blog介绍一下字符串反转吧。 C语言中所谓的字符串不过是字符数组,后跟一个0x00字符标识结尾,所以反转起来很容易,只要一个循环依次将第一个字符和最后一个字符交换,第二个字符和倒数第二个字符交换……如果最中间有两个字符(即需要反转的字符串长度为偶数),那就交换,如果最中间有一个字符(即需要反转的字符串长度为奇数),那就...
阅读全文
摘要: 签完offer后感觉人一下子就懒惰下来了,整天除了上课答个到就是跟群里同样签了offer的同学一起瞎聊,最近几天终于又静下心来拿起书继续看。 前几天读到第三部分内存管理的第16章线程的堆栈时看到作者提到了“C/C++运行期库的堆栈检查函数”,作者说这个函数叫StackCheck,并且给出了一段C语言代码来实现这个函数,昨天下午自己写了个程序测试了半天,分别定义了一些大小为40KB、80KB和320KB的数组,却发现线程被创建后已经是将比数组所需更大的栈内存提交到了物理存储器(即使只定义不使用这个数组),连我自己都不相信Windows和VC编译器会这么傻……在微博和群里问了很多人也没得到答...
阅读全文
摘要: 这几天又翻出一本《C++大学教程·第五版》看,看着看着就看到Fibonacci数列,很简单就写了个递归想算一下,代码非常朴素,但是没想到居然这么慢,加上个GetTickCount()函数一看,算到第40个数就耗费了大约31秒的时间,实在让人汗颜,在网上搜索了一把,发现了本文http://blog.zhaojie.me/2009/03/tail-recursion-and-continuation.html,大为惊叹,原来递归也是可以优化的,稍微修改了一下变为尾递归再计算,居然只需31毫秒,1000倍啊! 上面那个链接老赵写的很好,我就不浪费口水了,给出朴素的代码和优化后的代码充一下字
阅读全文
摘要: 昨天在我的vmware workstation里安装了一个ubuntu 11.04,但是昨晚装vmware tools时却一直有问题,安装成功后继续按回车,就会自动运行/usr/bin/vmware-config-tools.pl,进行第一次运行的配置,在这里却出现了问题。到了这个问题时: What is the location of the directory of C header files that match your running kernel?(/usr/src/linux/include) 在这里我直接看都没看就按了回车,没想到却说这个目录不存在,好吧,那就自己找一找,很.
阅读全文
摘要: 今天上午考网络,马马虎虎吧,及格应该没啥问题,高分可没想过。直到今天早上起床后才开始复习,共计复习了40分钟,只能跟着目录在大脑里把知识点回想一遍,稍微翻一下书。对于我一直裸考这件事情,有个roomate表示灰常羡慕…… 言归正传,上篇博客提到了用命令行传递句柄,而且说有时间了写一下用消息和环境变量传递句柄,今天下午好好玩了一下午,刚才觉得该写一下了,然后突然反应过来——这基本上就是照抄上文的代码嘛。于是新建工程复制代码,稍微修改了一下就成了本文,只写了用消息传递句柄的。汗,我越来越打酱油了。 再次申明一下,这三种方法不管哪一种都有一个前提,就是打开句柄时使用的SECURITY_ATTRIB.
阅读全文
摘要: 今天继续读《Windows核心编程》,读到了第3.3节——跨进程边界共享内核对象,先来动手写第一个程序,用命令行参数在父子进程之间传递可继承的句柄。这个程序写的很痛苦,因为对API编程还不够熟悉,老是存在各种各样的问题,早晨六点整就爬起来,一直鼓捣到十二点半才算写完,真无语了。 对象句柄是可以继承的,当然前提是在父子进程之间继承。想获得一个可以继承的句柄,应该在使用相应的Create*()函数时,将SECURITY_ATTRIBUTES结构体的bInheritHandle域要设置为TRUE。 创建子进程时将CreateProcess()函数的第五个参数bInheritHandles也设置为T.
阅读全文
摘要: /******************************************《Windows核心编程》第四版给出的这个例子代码有些问题,**我根据第五版的修正也修改了一下本文,**添加了一张新的测试截图,**重新上传了源代码。****************************************/ 准备从今天起重新捡起《Windows核心编程》这本书认真读一遍,每个代码都自己写一遍,书中提到的第一个例子就是ErrorShow,我也自己写了一个,就当练手吧,控制台程序写多了,windows程序怎么写都快忘光了。 关键代码其实就一个函数,FormatMessage()函数,以前
阅读全文
摘要: 一开始先给出一段简单的C代码: #include <stdio.h>int main(){ int i = 0; for ( ;i < 3; i++) { int num = printf("hello\n"); if (num != 0) { break; } } printf("aha,bye!\n"); return 0;} 代码非常简单,for循环应该循环3次,但是这里为了更好的演示这个bug,在第一次执行循环内的printf()语句时,程序就会因满足if语句的条件而跳出循环,事实上for循环在这里只会执行一次,这显然不是什么b
阅读全文
摘要: 前段时间在一个论坛上看到了一个帖子,lz发了一个代码,如下。注意,sizeof语句后面没有加分号。 #include <stdio.h>int main(){ int a; a = sizeof(long double) printf("%d\n",a); return 0;} 这个代码实在太简单了,我想大家学C/C++时都使用过这个代码,我们都会这样去看各种基本数据类型占用了几个字节的存储空间,但是这个敲错的代码却出现了一个很诡异的问题:尽管sizeof一句后面忘了加分号,但是使用VC6编译这个代码却是零错误零警告,只是运行时没有任何输出,这是怎么回事呢? 我
阅读全文
摘要: 关于IsDebuggerPresent()函数的文章已经数不胜数了,随便一搜就能找出一堆来,但是我还是准备写一份放在这里,算是留个备份吧。 微软给我们提供了一个API函数用来检测当前程序是否正在被调试,这就是可怜的IsDebuggerPresent() ,这个函数的存在似乎只是为了证明在Windows的世界里确实存在一个最杯具的API函数……这个函数的实现很简单,直接windbg查看一下:0:000> u kernel32!IsDebuggerPresentkernel32!IsDebuggerPresent:7c813133 64a118000000 mov eax,dword ptr
阅读全文