There should be one-- and preferably only one --obvious way to do it.
posted on 2008-04-18 20:32 犹志 阅读(1717) 评论(5) 编辑 收藏 引用
昏。在栈上的数据嘛,肯定没有问题了。 回复 更多评论
你到Release下看看.再用GCC编译一下试试.我试了这几种情况运行结果都不一样.说明这种用法存在问题,与printf无关.应该heap或在调用函数里把空间分配好,传给子函数赋值. 回复 更多评论
所谓stack自动清理的意思是:函数调用前后调整栈指针(SP)的任务编译器会自动帮你完成 至于指向栈中位置的指针,当然可以随便用,不过这和把指针指向内存位置0一样,后果自负 程序的运行结果无法证明程序的正确性 回复 更多评论
這是初學者很容易犯錯誤,想當年我初學C++時也是對這個問題覺得很奇怪。首先,把棧指針傳遞出來是原則性錯誤,在C++裡是不允許的,而在函數結束後讀取該指針指向的內容的行為是未知的。其次,棧內存是在函數開始執行時進行分配,在函數結束進行釋放的。再次,棧內容在函數結束是不會被清理的,因為釋放了的內存不需要再去清理。但正因為沒有進行清理,在調用此函數後,你馬上讀取該內存,在大部分情況下是可以讀取到原來的內容的,只要沒有其它的程序使用到該塊內存,那些內容是不會改變的,但這種操作是錯誤的,因為該塊內存已經被釋放了,你所讀取的是已經被釋放了的內存的內容。根據各種編譯器的編譯結果不同,根據系統需要不同,根據你程序編寫的不同,你這個函數所產生的結果是不可預料的,如上,後果自負。 回复 更多评论
starofrainnight说的很对;正如楼主所述,stack使用是由高向低进行的。而您代码中描述的: char szMessage[100]; strcpy(szMessage, "this is just a test!\n"); 数组Message是如此之大,而使用却如此之小,仅"this is just a test!\n"几个字符。这样,存储szMessage时从低址向高址进行,100-22=78个字节尚未使用,退出GetString函数之后。sp指针复原至调用GetString之前的位置。而调用GetPerson的活动记录太小,以至于没有破坏szMessage中存储的22个字符。所以,... 回复 更多评论