亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

知道為什么自己的結果和視頻不一樣了。視頻里應該是有問題的吧?

自己的輸出結果,跟很多底下評論的同學一樣,跟視頻里的是不一樣的:

$?./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的地址開始順序輸出的時候,沒有得到期望的結果。


正在回答

1 回答

這個要看編譯器的,老師講的內容,其實數組已經越界,在實際使用中不會出現的,如果實際應用中出現說明程序有問題。

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

知道為什么自己的結果和視頻不一樣了。視頻里應該是有問題的吧?

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號