语言陷阱:变量声明

前两周太忙了,从上周才稍微缓和些,也正是那段时间,背写了大量的代码,自然免不了错误的。但有些错误,在一定程度上,应该是可以避免的,比如下面的代码:

       int main(int argc, char* argv[]){
int* t = (int*)t;
for (int i = 0; i < 4; i++) {
t[i] = 0;
}
return 0;
}

       


对于编译本身来说,上面的代码不会产生任何问题:

       g++ -o a.txt test.cpp
       

gcc的版本:

       g++ --version
       g++ (GCC) 4.3.4 20090804 (release) 1
Copyright (c) 2008 Free Software Foundation, Inc.
本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保;
包括没有适销性和某一专用目的下的适用性担保。
      
      运行的话,也可能不会产生问题,我在cygwin下运行就没有任何错误,但谁都知道,上面的代码是有问题的。t在声明的时候,同时定义了它的值,从人的概念上来说,这个时候t还没有存在,因此,语法应该是有问题的。但编译器并不这样认为,它反过来认为了,它首先声明int* t的地址,然后将地址给了它自身,这是合法的,同时,并没有使用未初始化的变量,int* t在声明的时候已经初始化了,所以,编译器甚至不愿意给一个警告。编译器会说:代码没有任何问题。而这类问题,通常很难查找。
      其实,上面的问题在调试的时候也比较容易,问题在于,某些平台(比如我现在用的),程序的机制比较单纯,几乎没有任何保护机制,当问题表现出来之后,通常在很多歌正常的操作之后随机出现,由于调用栈可能被破坏,造成未知的结果。
      给自己一个教训,以后写程序的时候,应该摒除杂念。

2条评论

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据