char a[] = {'A'/span>};
printf(This is random value %c", &a[0] ) 。
uj5u.com熱心網友回復:
這個程式呼叫了未定義的行為,因為%c不是地址的正確轉換指定符。使用%p,并將引數投給(void*)。
注意:如果引數的型別是char*,鑄造是可選的,但對于任何其他型別,鑄造是必要的。
uj5u.com熱心網友回復:
你列印的地址是錯誤的。
%c是用于列印字符。要列印一個地址,請使用%p并將指標引數(即地址)轉換為void-pointer。如
printf(This is random value %p", (void*)&a[0] ) 。
C標準并沒有定義你的程式應該發生什么。因此,原則上任何事情都可能發生,隨機值可能是結果。沒有人可以確定你的代碼會做什么(如果沒有你所使用的特定系統的專家級知識)。
然而,在大多數系統中,你的代碼將從指標中獲取一個位元組,并將其作為一個字符來列印。因此,你的 "隨機字符 "的(可能)原因是,每次你啟動程式時,陣列的地址是不同的。而這正是許多系統所做的......
他們使用 "地址空間布局隨機化"。這基本上意味著在程式啟動時,你的程式中的東西(這里是指陣列)的地址是隨機確定的。這樣做的目的是使黑客更難利用你的程式。在這里閱讀更多資訊。https://en.wikipedia.org/wiki/Address_space_layout_randomization
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/306939.html
標籤:
