西西软件园多重安全检测下载网站、值得信赖的软件下载站!
软件
软件
文章
搜索

首页编程开发VC|VC++ → TC过时了吗,Turbo C 的一些问题

TC过时了吗,Turbo C 的一些问题

相关软件相关文章发表评论 来源:本站整理时间:2010/10/3 23:01:49字体大小:A-A+

作者:佚名点击:559次评论:1次标签: TC turboc

  • 类型:修改器大小:539KB语言:中文 评分:7.0
  • 标签:
立即下载
7 页 越界检查

/----------------------------------------------------------------------/
六。越界检查
由于在DOS下,DOS系统根本不会去检查程序的访问越界问题,无论你要对内存的哪里
进行读写,都是允许的(只要不把自己程序的代码区改写了就没事)。但在Windows下,
尤其是WinXP,内存是分块的,对只读块写数据或者对不可读写块进行读数据都会引发
异常,如果程序不能够处理这个异常,那么这个程序就会被强制关闭。有了这个异常
机制,当然会使你更容易查出程序的错误。特别地,在VC6的Debug模式下,
堆里未被初始化的内存被0xCD字节模式填充,堆里释放的内存被0xDD字节模式填充。
于是一但发生越界的时候,很容易通过程序运行结果得知当中有错,为调试带来了方便。
然而TC则不然,不管你越界了多少,你都收不到任何的警告或者错误。
而且在多数情况下,TC下运行正常的越界代码换VC6上就会结果出错。
有初学者以为这是VC6编译器有问题,其实不然,而是TC给你掩盖了这个错误。
#include <stdio.h>
int main(void)
{
int n;
int num[8];
int sum[8] = {0};
for(n=1;n<=8;++n)num[n] = 1;
for(n=1;n<8;++n)sum[n] = num[n]+num[n+1];
for(n=1;n<8;++n)
printf("%d\n", sum[n]);
getchar();
return 0;
}
这个程序的目的是给num数组全部给1,然后sum数组计算num相邻两个数的和。
有的初学者可能会说,这个程序没问题,如果他以为int num[8];的下标是从1至8的话。
然后,照样运行一下看看。TC的结果是7个2,结果正常。
VC6的结果是,什么都没有显示,然后你打开资源管理器查看一下进程,
你就会发现这个程序占用CPU高达90%以上。你不要以为这是编译器发生了问题,
原因正是因为这里的越界导致了一个死循环!如果是GCC或更高版本的VC编译器,
把for里的8改成11也会发生死循环。但即使改成11,在TC上运行的结果也非常正常,
TC里完全没有任何错误的征兆。这里不分析这个死循环产生的原因,这里只是想告诉你,
你在TC上运行结果无误的程序不一定就逻辑上正确了(包括VC和GCC)。特别是TC几乎
没有任何的越界检查,所以更要求程序员在TC上编写代码时候要十分谨慎和细心。
但现在问题是现在使用TC的大多是初学者,在没有什么经验的情况下,很大可能
会写出类似这样的越界访问代码。这种代码也许在TC上没有问题,可是只要换一个
编译环境,问题就马上暴露出来了。不信就看看下面的经典TC错误代码吧:
#include <stdio.h>
int main(void)
{
char *pstr;
gets(pstr);
puts(pstr);
getchar();
return 0;
}
(别告诉我说你不知道这代码错在哪里,你不知道错哪里的话那你平时一定是使用TC的)


    相关评论

    阅读本文后您有什么感想? 已有人给出评价!

    • 8 喜欢喜欢
    • 3 顶
    • 1 难过难过
    • 5 囧
    • 3 围观围观
    • 2 无聊无聊

    热门评论

    最新评论

    发表评论 查看所有评论(1)

    昵称:
    表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲
    字数: 0/500 (您的评论需要经过审核才能显示)