我有一段代碼,我試圖返回*ptr
指向的值的平方。這個C代碼有什麼問題
int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
main()
{
int a=8,t;
t=square(&a);
printf("%d",t);
}
它爲我,但這段代碼的作者工作正常,說可能不是因爲以下原因工作:因爲它可能爲*ptr
值意外改變
,有可能A和B是不同。因此,這段代碼可能會返回一個不是正方形的數字!正確的方法是
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}
我真的很想知道他爲什麼這麼說?
如果'* ptr'在賦值給a和賦值給b之間改變,結果不是一個正方形。我不知道什麼會導致'* ptr'改變。 – Sjoerd 2012-01-16 12:42:15
在多線程環境中,我能想到的只有* ptr的內容可以在另一個線程中更改。在這種情況下,a可能與b有不同的值。 – Totonga 2012-01-16 12:44:50
你的第二個版本有誤導性的簽名; 'a * a'是一個'int',隱式轉換爲'long'對於提高返回值的精度來說太遲了。爲了解決這個問題,你應該把'a'聲明爲'long'。 (當然,在很多系統中,long和int都是同義詞。) – ruakh 2012-01-16 14:25:51