程序二: #include <stdio.h> long array[10 *1024 * 1024] = { 0xcccccccc }; int main() { printf("Hello World!\n"); } 所以,从这里看出为什么要了解平台。任何的程序编译出来都和平台有关。如果脱离平台,任何语言都没有什么意义了。 ========================================= 呵呵,当年SUN推Java的口号就是其平台独立性了。虽说这一点Sun也不是完美的,但是很多小程序跨平台完全没有问题。 局部变量完全在堆栈里面去实现。 ========================================= 什么意思呢?我们可以看看一小段VC程序反汇编的结果 push ebp mov ebp,esp sub esp,44h ... ... pop ebp 这段代码的sub esp, 44h就是在栈里给局部变量预留空间了,以后的push/pop操作只会从减去44h的esp处开始了。而在ebp和esp-44h之间的这段空间就是局部变量的空间了。 《箴言》里提到函数不能把自己的局部变量传递给上层函数,明白了上面的原理我们就很清楚了:返回到上层函数后,堆栈指针也就相应上去了,谁也不知道栈里是些什么值了。 其实,把函数局部变量传递给上层函数会导致很隐秘的bug,因为在有的程序流程里,栈里面的值没有被破坏,那么程序“好像”还可以工作,而如果在另外的流程里栈值被破坏了,那么程序立即就不对了。所以对这种问题一定要当心。
|