2014-03-27 29 views
0

我的代碼是Objective-C和C的混合。我簡化了下面的代碼,但它仍然會產生相同的錯誤。在Objective-C的文件:使用指針引起內存錯誤的簡單函數

CGFloat r,g,b = 0.5; 
CGFloat x,y,z = 0.0; 

foo(r, g, b , &x, &y, &z); 

以及C部分(導入C文件):

void foo(CGFloat R, CGFloat G, CGFloat B, CGFloat *X, CGFloat *Y, CGFloat *Z) { 

    *X = 5; 
    *Y = 5; 
    *Z = 5; 

} 


分配給什麼的指針之一,當錯誤發生 - 它說EXS_BAD_ACCESS 。我錯過了什麼(或沒有正確理解?)。我假設可以在同一個項目中使用單獨的.c和.m文件是很好的......無論如何,它似乎都可以很好地構建。

+0

調試器說什麼? 「X/Y/Z」的內容是什麼? –

+0

@BryanChen調試器不會說什麼,並且X/Y/Z似乎被設置爲隨機值。只是注意到它不會崩潰在64位,只在32位......怪異。 –

+0

你是怎麼稱呼它的?用真實代碼 –

回答

-1

您必須爲所有變量初始化內存。試試這個:

CGFloat r = 0.5, g = 0.5, b = 0.5; 
CGFloat x = 0, y = 0, z = 0; 

foo(r, g, b , &x, &y, &z); 

在Objective-C,如果你試圖訪問一個變量的存儲位置,即&x,而無需首先將值分配給它,它會給你一個EXS_BAD_ACCESS。但是,r,g和b不需要初始化(但如果不這樣做,將會有垃圾數據)。

+0

初始化內存不錯。但它不會導致崩潰 –

+0

它將在Objective-c中,如果您嘗試訪問變量的內存位置,即「&x」,而無需先爲其分配值。 – Jason

+0

真的嗎?在這種情況下,ObjC如何與C不同?我看不到未初始化變量的地址如何導致崩潰。這甚至不是未定義的行爲(我認爲)。 –

0

在我的c源文件的頭文件中,有一些流氓行將CGFloat聲明爲double。刪除,並用我的C文件中的所有CGFloat替換爲浮點數。