你這個代碼問題多多,在編譯器上多處警告,純粹練習分析不妨,實際程序不要這樣寫。
首先看流程,按照代碼的順序從上向下看:
定義了2個指針p和q,然後你向堆内存申請了一塊動態空間(儲存一個test結構的數據),你把這2個指針都指向了這裏,它們指向同一個地方,也就是説,這2個指針是等效的。
申請了空間之後,數據裏面的值是不定的,於是你使用賦值語句給它賦值,不管是使用p還是q,都是一樣的。你給這塊空間的data賦值了3,next指向自己。最後,q=p是多餘的,因爲它們本來就是這樣,屬於重複語句。
然後,你又向堆内存重新申請了一塊test結構的空間,這次把這處内存的地址賦給了指針p。這個動作的後果,即是把原先p、q分離了,q仍然指向第一次的位置,p指向了新的位置,新的位置上data是4。
好了,答案來了,你輸出打印的是q的data值,因爲q指向原先的位置,那裏的data值是3。
問題所在:這個代碼存在内存泄漏問題,向堆内存申請的動態數據沒有主動釋放,雖然現代操作系統都會在程序結束時收回一切内存,這個程序很短小,也沒有其餘函數和動作,所以運行結束一般是沒有問題的,但作爲良好的編碼風格,必須養成自己主動釋放内存的習慣,C/C++最大的隱患就是關於指針涉及的内存泄露和覆蓋、篡改等問題,如果你對指針使用的過程不是自始至終瞭然於胸,就不要貿然使用指針。
這個程序的詳細分析,是告訴你,你的問題在於不知道代碼每一行都在幹什麽,很可能,你不知道malloc()每次是重新請求分配内存的。
[此贴子已经被作者于2019-4-29 16:58编辑过]