|
論壇說明 | 標記討論區已讀 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2006-02-26, 04:27 PM | #1 |
管理版主
|
C++ 變數 記憶體位址 的直接指定
以下程式是這樣的
f1() : 函式一將會把他的一個本地變數 記憶體位址傳出 f2() : 函式二,就函式一使用過的 變數記憶體位址 直接指明使用之 main: 主程式,將函式一使用過的 變數記憶體位址 列印出 "內涵值" 有何目的呢? 我們都知道,函式的 本地變數 在退出函式後(組合語言是 ret 返回) 會釋放 "它" ※也就是 f1() 1.那得到這個 變數的記憶體位址 後,可否不經由 宣告變數而使用他呢? (也就是直接用指標指向這個記憶體位址,間接用指標對其讀寫) 2.本地變數 失效後(也就是退出函式後) 其內容如何? 3.當運行別的函式時,這個位址會有何變化? 看過結果後會發現 C/C++ 與其它語言的不同 總之有興趣的網友先試試以下程式再說吧 PHP 語法:
|
送花文章: 2007,
|
2006-03-01, 04:27 PM | #2 (permalink) |
管理版主
|
或許有人會問 reinterpret_cast<型態>變數 是作什麼的
答案是... 相當於 (型態)變數 是一種強迫轉換型態的執行期 指令 為何不直接用 (型態)變數 呢? 因為 _cast 是一種 強迫轉換型態 的慣用字眼 程式一寫大了要搜尋時就比較方便 所以可以用 void *buf= (void*)usememaddress; int *vptr= (int*)VarMemAddress; 替換之 void *buf= reinterpret_cast<void*>(usememaddress); int *vptr= reinterpret_cast<int*>(VarMemAddress); 至於 Q1~Q3 答案,會根據不同的編譯器 有不同答案 ============================== 首先是 Dev-C++ A1: 運行一次答案是肯定的 "可不經由宣告變數而使用該記憶體位址" 也就是直接使用 資料節區的記憶體資源 A2: 是不變的 接著 A3: 則會被改變,個人這裡運行的結果是 2009095316 ============================== 接著是 VC++ A1: 也是肯定的 A2: 則是會改變,個人這裡運行的結果是 1245056 至於在 "清除並且釋放記憶體" 這一段的 delete 是違法的 可直接 new 一個位址,但卻不能用 delete位址 直接釋放 A3: 也是 被改變,個人這裡運行的結果是 4198844 所以VC++無論是離開函式還是進入函式,其原本的內容都會被更改 那解開了後到底有什麼用呢? 簡單講就是 養成 變數宣告之同時賦予初值的習慣 還有一些特殊使用需求 |
送花文章: 2007,
|