2016-09-10 30 views
4

有人問我一個問題,在最近的一次採訪中有以下揮發性作爲參數標識

int square(volatile int * p) 
{ 
    return *p**p; 
} 

定義的函數有人告訴我,有一些事錯誤是這個功能,不利於計算平方,我認爲這是由於波動,任何人都可以解釋爲什麼?

+0

因爲'volatile'表明'* p'可能通過'* p * * p'的評估中途改變。特別是在嵌入式設備中,「p」可能是任何奇怪的東西,例如一些硬件直接存儲並且不斷更新計數器當前值的內存指針,或者一些奇怪的東西,比如說,每次讀取它時都會改變它的值,或者其他什麼,天空真的是極限。 –

+0

因此,在這種情況下定義像「p」這樣的指針是正常的做法是揮發性的,這樣做的優點和缺點是什麼 – Uint32

+0

不,最好的方式是Kerrek SB的答案;在這裏沒有指針,沒有'volatile'任何東西,只是'int square(int)',讓調用者爲給定的情況做正確的事情(比如'square(* p)')。另外,不要把'volatile'看作是具有「優勢」和「劣勢」的東西,它只是一個工作的工具:在需要時使用它,並且意識到它的含義。 –

回答

7

有可能是一個假設,因爲*p是一種揮發性的訪問,它的值可以在每個評估時不同,因此你應該只一次評價它:

int q = *p; 
return q * q; 

那是當然愚蠢的設計;該功能應該確實是int square(int)來電應該說square(*p)