日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一道内存分配的面试题后续

發(fā)布時間:2023/12/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一道内存分配的面试题后续 小編覺得挺不錯的,現(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

微信掃描二維碼,關注我的公眾號

總結

以上是生活随笔為你收集整理的一道内存分配的面试题后续的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。