知道為什么自己的結(jié)果和視頻不一樣了。視頻里應(yīng)該是有問題的吧?
自己的輸出結(jié)果,跟很多底下評(píng)論的同學(xué)一樣,跟視頻里的是不一樣的:
$?./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」本身占據(jù)了整型變量之間的地址位,所以輸出的結(jié)果和視頻里不一樣,不是連續(xù)的,而是出現(xiàn)了隨機(jī)數(shù)。在64位操作系統(tǒng)里,指針p本身占據(jù)8個(gè)字節(jié)。我這里的gdb的結(jié)果如下:
(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個(gè)字節(jié)的值,因?yàn)闆]有被初始化過,所以是系統(tǒng)隨機(jī)給的數(shù); 第五行輸出的p[4]=32766,這是指針變量p本身所在位置的后4個(gè)字節(jié)的值,因?yàn)闆]有被初始化過,所以是系統(tǒng)隨機(jī)給的數(shù); 第六行輸出的p[5]=5,這是數(shù)組array[0]的值,沒有疑問。
綜上所述,編譯器編譯程序時(shí),正如之前老師講過的,會(huì)自動(dòng)優(yōu)化內(nèi)存分配,把同類型的變量分配到一段連續(xù)的內(nèi)存里,所以這里就把所有的整型變量都挨個(gè)分配在一起了,只不過順序并不是我們想象的那樣從a到b到array到i到指針p本身,而是把變量i和指針p本身插到了a、b、array的中間,所以程序代碼從a的地址開始順序輸出的時(shí)候,沒有得到期望的結(jié)果。
2019-06-18
這個(gè)要看編譯器的,老師講的內(nèi)容,其實(shí)數(shù)組已經(jīng)越界,在實(shí)際使用中不會(huì)出現(xiàn)的,如果實(shí)際應(yīng)用中出現(xiàn)說明程序有問題。