前两周太忙了,从上周才稍微缓和些,也正是那段时间,背写了大量的代码,自然免不了错误的。但有些错误,在一定程度上,应该是可以避免的,比如下面的代码:
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在声明的时候已经初始化了,所以,编译器甚至不愿意给一个警告。编译器会说:代码没有任何问题。而这类问题,通常很难查找。 其实,上面的问题在调试的时候也比较容易,问题在于,某些平台(比如我现在用的),程序的机制比较单纯,几乎没有任何保护机制,当问题表现出来之后,通常在很多歌正常的操作之后随机出现,由于调用栈可能被破坏,造成未知的结果。 给自己一个教训,以后写程序的时候,应该摒除杂念。
虽然我这个外行看不懂,有时间我还是会经常来逛逛!加油~
谢谢鼓励