2016-12-26 58 views
0

我正在調用一個函數,其原型是int foo(int device, double *x, double *y) 而我這樣稱呼它是這樣的foo(dev, (double*)x, (double*)y);,其中x和y都是指向浮點數的指針。通過值傳遞的變量是否可以更改其值? (In C)

由於某些原因,設備正在以1的形式輸入函數並以隨機巨大值退出。

是可能的,因爲富處理雙打,我通過浮游物與他們的記憶混爲一談?

+0

你沒有得到'x'和'y'的指針,你將它們轉換爲指針。 –

+5

你所做的是告訴編譯器x和y指向浮動,這實際上是一個謊言。因此,C語言標準會說你的程序有「未定義的行爲」。它有可能做任何事情。 – Gene

+0

使演員沉默編譯器警告可能會導致... –

回答

1

由於某些原因,設備進入函數1,並以隨機巨大值退出。

發生了什麼可能是比。

你告訴你傳遞指針,比如說元件的系統,字節 - 但這些要素是規模僅次於字節。因此,被調用函數寫入其所接收指針的元素之一,實際上覆蓋了兩個元素(如果可用)。如果沒有元素可用於接收值...

這種事情會導致「未定義的行爲」 - 從字面上看,任何事情都可能發生(很少,程序甚至可以工作,並且沒有人知道爲什麼 - 所以「但它工作!「不應該保證)。

我懷疑你曾經在棧上分配的兩種開發和x作爲臨時變量:

float x[2]; 
int dev; 

在這一點上,x的地址是在調用者的堆棧,哪裏還開發居住裏面指指點點。調用原型不匹配導致dev 的覆蓋以及誰知道還有什麼即使你沒有通過dev作爲參數,它也將被覆蓋所有相同的

+0

就是這樣,謝謝!我想在C中你真的要小心你的所作所爲。 – Pedro

+0

不單單是在C :-)但是,你有。我經常保持*所有*警告啓用,並建議你也這樣做。此外,您可能會發現'valgrind'實用程序可用於調試難以發現的內存錯誤。 – LSerni