回覆列表
  • 1 # 使用者478466452993

    你的猜想是對的,在printf之前,p除錯能看到值"helloworld",但是一輸出就指向了一個不知道的地址。但是你要想為什麼,為什麼之前p的值是對的,呼叫printf就不對了。那如果你在除錯時,按F11進入printf你會發現printf是一大段的彙編程式碼,這些彙編程式碼就是導致p失效的原因,因為printf中有很多臨時變數,而p也是指向臨時變數。

    首先函式返回,臨時變數釋放,但是儲存臨時變數的資料並不會被刪除,只是被系統標記為未被佔用,以後有需要使用時可以直接覆蓋使用。所以p指向被釋放的臨時指標temp_one,而temp_one指向的資料"helloworld"還存在記憶體的某處,這個p也存在記憶體某處。這個某處就是棧上,當然如果你不懂函式呼叫和棧的關係也不要緊,只要知道它在後面會被覆蓋就行了。出來以後,因為沒有任何變數分配,所以這些不會被覆蓋,造成你在除錯時能暫時看到它們。然後呼叫printf,這裡面前面說過了,很多臨時變數分配,既然p指標和"helloworld"已經被系統標記為未佔用,那系統為緊湊使用記憶體,當然不會放過這兩個未佔用空間,所以導致p指標被改寫,指向了不知道的地方。至於"helloworld"有沒有被改寫不知道,反正你是看不到它了,或者你用"0x006ff7cc"地址檢視記憶體還能看到它。

  • 中秋節和大豐收的關聯?
  • 讚美“久違的陽光”的句子有哪些?