知道為什么自己的結果和視頻不一樣了。視頻里應該是有問題的吧?
自己的輸出結果,跟很多底下評論的同學一樣,跟視頻里的是不一樣的:
$?./a.out? *p?=?3 *p?=?1 *p?=?2 *p?=?1384734840 *p?=?32766 *p?=?5 ---------------------------------------------------- p[0]?=?3 p[1]?=?1 p[2]?=?2 p[3]?=?1384734828 p[4]?=?32766 p[5]?=?5
在gdb里,輸出了一下所有變量的地址,知道了原因是「指針p」本身占據了整型變量之間的地址位,所以輸出的結果和視頻里不一樣,不是連續的,而是出現了隨機數。在64位操作系統里,指針p本身占據8個字節。我這里的gdb的結果如下:
(gdb)?p?a $1?=?3 (gdb)?p?&a $2?=?(int?*)?0x7fffffffdabc (gdb)?p?b $3?=?2 (gdb)?p?&b $4?=?(int?*)?0x7fffffffdac4 (gdb)?p??i $5?=?0 (gdb)?p?&i $6?=?(int?*)?0x7fffffffdac0 (gdb)?p?p $7?=?(int?*)?0x7fffffffdac0 (gdb)?p?&p $8?=?(int?**)?0x7fffffffdac8 (gdb)?p?array[0] $9?=?5 (gdb)?p?&array[0] $10?=?(int?*)?0x7fffffffdad0 (gdb)?p?array[1] $11?=?50 (gdb)?p?&array[1] $12?=?(int?*)?0x7fffffffdad4 (gdb)?p?array[2] $13?=?500 (gdb)?p?&array[2] $14?=?(int?*)?0x7fffffffdad8
所以,再回頭去看程序的輸出,就可以知道:
第一行輸出的p[0]=3,這是變量a的值,沒有疑問; 第二行輸出的p[1]=1,這是變量i的值,沒有疑問; 第三行輸出的p[2]=2,這是變量b的值,沒有疑問; 第四行輸出的p[3]=1384734840,這是指針變量p本身所在位置的前4個字節的值,因為沒有被初始化過,所以是系統隨機給的數; 第五行輸出的p[4]=32766,這是指針變量p本身所在位置的后4個字節的值,因為沒有被初始化過,所以是系統隨機給的數; 第六行輸出的p[5]=5,這是數組array[0]的值,沒有疑問。
綜上所述,編譯器編譯程序時,正如之前老師講過的,會自動優化內存分配,把同類型的變量分配到一段連續的內存里,所以這里就把所有的整型變量都挨個分配在一起了,只不過順序并不是我們想象的那樣從a到b到array到i到指針p本身,而是把變量i和指針p本身插到了a、b、array的中間,所以程序代碼從a的地址開始順序輸出的時候,沒有得到期望的結果。
2019-06-18
這個要看編譯器的,老師講的內容,其實數組已經越界,在實際使用中不會出現的,如果實際應用中出現說明程序有問題。