一道内存分配的面试题后续
生活随笔
收集整理的這篇文章主要介紹了
一道内存分配的面试题后续
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
昨天寫的題目,在VC6.0上面測試一下
一道內存分配的面試題
結果發(fā)現(xiàn)一個問題,發(fā)現(xiàn)輸出結果竟然沒有問題,我很慌,如果這樣的輸出結果沒有問題的話,那肯定是跟我們的理論對不上號的。
所以我只能繼續(xù)調試
先把問題拋在printf上,懷疑printf輸出是有問題的,基于這個猜測,我自己寫了一個printf函數(shù)。
#include?"stdafx.h" #include?"stdio.h"char?*?pg?=NULL;void?test_printf(char?*?pch) {while(*pch?!=?0)putchar(*pch++);putchar('\n'); }char?*?test_function(int?n) {int?a?=?3;char?*p1?=?"123";char?p2[]?=?"456";pg?=?(char?*)p2;printf("%p?%p?%p\n",&a,p1,p2);if(n?==?0)return?p1;return?pg; }int?main(int?argc,?char*?argv[]) {test_printf(test_function(1));test_printf(test_function(0));printf("%s\n",(char?*)0x0019fecc);printf("%s\n",(char?*)0x0019fecc);return?0; }0x0019fecc 這個地址每個人程序會不一樣,不要照抄。
程序輸出
如果使用默認的printf輸出,這樣的代碼
#include?"stdio.h"char?*?pg?=NULL;char?*?test_function(int?n) {int?a?=?3;char?*p1?=?"123";char?p2[]?=?"456";pg?=?(char?*)p2;printf("%p?%p?%p\n",&a,p1,p2);if(n?==?0)return?p1;return?pg; }int?main(int?argc,?char*?argv[]) {printf("%s\n",test_function(1));printf("%s\n",test_function(0));return?0; }輸出沒有問題
這時候我們只能進行單步調試了
注意單步調試的最后一步,在test_function退出的時候,p2地址0x0019fecc地址的內容已經改變,但是經過printf調用后,這個地址的內容就被取走了。然后再調用一次就出問題了。
在第一次函數(shù)執(zhí)行結束后,0x0019fecc地址的值還是 456。
但是在執(zhí)行printf之后,0x0019fecc中的內容就被改變了,如下圖
推薦閱讀:
專輯|Linux文章匯總
專輯|程序人生
專輯|C語言
我的知識小密圈
關注公眾號,后臺回復「1024」獲取學習資料網盤鏈接。
歡迎點贊,關注,轉發(fā),在看,您的每一次鼓勵,我都將銘記于心~
嵌入式Linux
微信掃描二維碼,關注我的公眾號
總結
以上是生活随笔為你收集整理的一道内存分配的面试题后续的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ARM指令集详解(超详细!带实例!)
- 下一篇: unity渲染管线及升级URP