关于测试

来源:互联网 发布:淘宝卖家退货流程明细 编辑:程序博客网 时间:2024/04/28 09:01

实现 malloc() 和 free() 之后我进行了几个测试看它们是不是生效,但是总有些问题,我使用如下代码进行测试(putch2() 和 getch2() 是我之前实现的向屏幕输出字符的函数,经测试无误,malloc2() 是我的 malloc() 函数):

void t_main()
{
    
char* q/*=(char*)malloc2(1000)*/
;
    
//Here I turn off the memory management firstly and turn on secondly

    q[10]='a';
    putch2(q[
10
]);
    getch2();getch2();
}

首先,我关闭内存分配然后另 q[10] 的值为字符 a,随后打印到标准输出,然而奇怪的事情发生了,这个对照试验奇迹般的成功了,但是,依照在 VC++ 和 Sun Studio 的经验,这个应该是 Core Dump! 于是我想去将它移植到 VC++ 上,于是我重起到 Vista 并在 VS8 中调试,先是出现 'Error C2443 寄存器大小与操作数不符',我用 sizeof 查看 VC++ 的 int 类型大小,是 4 字节 32 位,难怪不符,使用 WORD PTR 伪指令限制,编译通过了但是问题又来了,运行时提示运行时错误,错误语句直指中断,郁闷,XP 还支持的中断到了 Vista 下却不支持了,还给不给系统层面一点活路了,为了提高安全层面将保护做到了这样的地步,唉,又翻回去启动虚拟机,想移植到 Solaris 上,但可恨的是,问题总是出现,GCC 用的居然是 AT&T 汇编,可我用的是 Intel 处理器啊?!没天理了,去语法转换吧,真找到了,一看就晕菜了,目的操作数和源操作数跟 Intel 汇编是反的!而且伪指令也不同!一气之下不用了,此时深感保护模式和实模式的不同,后来想想,汇编里有这样的规则:在汇编里声明一个数组,当越界时是没有错误提示的,只不过是顺延着往后写数据。原来如此,有可能是这个原因,于是我想用 WinHEX 打开 VM 的内存看看,很不幸,它是锁着的,但难不倒我,我打开整个驱动器,找到那个文件,就不锁了,但是我顺着内存找了一圈没发现什么,于是我决定作下一个试验来验证我的想法和函数。我使用更大的指针来测试,这回我把数组假设为了1000字节,我的程序很小,只有 150 字节,如果在没有内存分配机制的独立环境下运行我的程序,并且我的想法是正确的,我的程序应该很苦恼,因为它原则上是不能超越变量地址到程序结尾处这样一段空间的,所以它会最终因无法分配足够空间而崩溃,至于结果不是运行错误就是死循环,于是,我用如下代码测试:

void t_main()
{
    
char* q/*=(char*)malloc2(1000)*/
;
    
//Here I turn off the memory management firstly and turn on secondly

    int i=1;
    
for(;i<1000;i++
)
        q[i]
=(i%26)+96
;
    putch2(q[
999
]);
    getch2();getch2();
}

我首先使用无内存分配的程序段进行测试,虚拟机死机,表示我的猜想是正确的,然后我用我的函数进行内存分配,程序达到了预期结果!说明我的函数生效了。
原创粉丝点击