2015-05-29 68 views
1

下面是我的代碼:請問這個結果在賽格故障

p = (float *) malloc(sizeof(float) * n); 
p1 = p; // p1 is float* 
p--; // Will this result in a seg-fault? 

我猜是因爲我試圖訪問內存外分配的空間。 請有人確認嗎?

編輯 在看到霍布斯的回答後,我無法抗拒這個問題。

我堅信這不會導致賽格故障

printf("%f",p[n]); // because n is legally allocated for p 
+2

相關和可能重複[減少指針越界;遞增到邊界](http://stackoverflow.com/q/18186987/1708801)和[是否應用一個已指向數組底座的指針後減量調用未定義的行爲?](http://stackoverflow.com/q/30512669/1708801) –

+3

而不是猜測你爲什麼不嘗試呢? – JAL

+2

@JAL你不能「嘗試」未定義的行爲 –

回答

4

根本沒有訪問任何內存;你正在做指針算術。使用指針算法來獲取不在對象內或超過數組末尾的指針是未定義的行爲,因此可能發生任何事情,包括段錯誤。但是,在大多數合理的系統上,除非您嘗試使用*p做某些事情,否則什麼都不會發生。那時,從接收垃圾值到碰撞/段錯誤,再到全球熱核戰爭,都可能發生任何事情。

+0

Thankyou hobbs :-)。我肯定不會解除引用** p **。請參閱編輯。 – sjsam

3

這將導致不確定的行爲。如果你試圖通過去引用p來做任何事情,程序會拋出一個分段錯誤或者做一些你不想要的東西。

+1

爲什麼它會是UB?它只是一個指針遞減,沒有任何解除引用的嘗試。 –

+0

'int * p;'在一個函數中,因此是UB,即使它在下一行中被調入。 –

+0

@bolov所以'int * p = 0x12345'也是UB嗎?不太可能.. –

1

訪問分配區以外的內存時,並不總是遇到seg錯誤。訪問的內存可能會分配給其他內容。所以任何一種情況都可能發生,但都是不良行爲。

指針p被允許包含「壞」指針,並且不會發生不良行爲。考慮未初始化時的狀態。如果您通過取消引用來使用指針,那麼您將遇到seg故障或訪問其他人的內存,這是不受歡迎的行爲。

+0

我想OP的觀點是沒有這樣的訪問正在執行。指針遞減,就是這樣。沒有取消引用發生。 –

+0

的確如此。 @sjsam,指針p被允許包含一個「壞」指針,並且不會發生不良行爲。如果您通過取消引用來使用指針,那麼您將遇到seg故障或訪問其他人的內存,這是不受歡迎的行爲。 – Dko

+0

@MartinJames:你說得對,我確定我不會解除引用。 :-) – sjsam