2010-08-24 40 views
0

編輯:一個初始的「float **漂浮;」是一個錯誤,更正。此外,「*浮動[0] = 1.0;」確實有效,但「*浮動[1] = 1.0;」 segfauls在那一點上。該數組是malloced。編纂對迂腐c99沒有任何警告。爲什麼這個指針不能傳遞?

這工作:

(僞:)

void func(int*); 
int i; 
func(&i); 
void func(int* i) { 
func2(i); 
} 
void func2(int* i) { 
*i = 2; 
} 

初始值改變爲2

但這並不起作用:在分配

void func(float**); 
float* floats; 
func(&floats); 
void func(float** floats) { 
func2(floats); 
} 
void func2(float** floats) { 
*floats[1] = 1.0; 
} 

段錯誤;

+1

什麼樣的編譯器可以讓你編譯這個沒有錯誤? – 2010-08-24 00:29:25

+1

我們在黑暗中刺傷,直到您發佈實際的代碼。這裏有什麼不編譯,並有大量的錯字('浮動**浮動')。如果你可以在實際的編譯測試程序中複製你的錯誤,這將是一個很大的幫助。 – 2010-08-24 00:33:12

+1

如果你已經修復了你的拼寫錯誤,那麼在給* * * floats [1] *賦值之前,你的當前代碼仍然需要先爲* \ * float *分配一些內存。 * float *是指向* float *的指針,* \ * float *是指向一個float數組的指針。 – smwikipedia 2010-08-24 00:58:46

回答

1

你爲什麼要傳遞一個指向數組的指針?您是否嘗試過

func(float *floats) 
{ 
    func2(floats); 
} 

func2(float *floats) 
{ 
    floats[0] = 2; 
} 
+0

不是這個問題;重點是操縱外部的函數變量。 – 2010-08-24 00:53:52

+0

我明白了,但數組是作爲指針傳遞的,除非打算更改分配內存的地址,否則不會傳遞指向數組指針的指針。試試我的解決方案,讓我知道它是否適合你。 – 2010-08-24 00:55:17

3

因爲'浮動'是一個糟糕的指針。當然,你聲明瞭指針,但是你沒有分配任何內存,所以無論它發生在哪裏,它都是無效的。

另外,float **的地址是一個float ***,這不是你的函數所要求的。

+1

老兄,發佈你的真實代碼。不要讓人們浪費時間來調試轉錄錯誤和遺漏。 – 2010-08-24 00:34:09

+0

你在說什麼?如果你不能理解像我之前所說的那樣簡單的事情,那麼也許你應該從一個初學者的教程開始。 – 2010-08-24 05:33:33

0

說你有這些2個funcs中,就像你貼:

void func2(float** floats) { 
*floats[1] = 1.0; 
} 
void func(float** floats) { 
func2(floats); 
} 

然後你有下面的代碼:

float* floats; 
func(&floats); 

會發生什麼?首先,floatsfloat *,並且由於它沒有被分配,它指向一個隨機存儲單元,比如0xBADD。如果你寫信給這裏,你可能會搞砸了。

floats,&floats的地址是指向堆棧上的另一個存儲位置,如0x1000。這是傳遞給func,然後逐字傳遞給func2

func2是做什麼用的?它試圖在*floats[1]的位置寫點東西。我不確定首先發生什麼事情,支架或明星,所以我們來看兩種情況:

*(floats[1]):首先您會找到floats[1]是什麼。由於floats是初始floats變量的內存位置,因此爲0x1000floats[1]將是0x1004,因爲假設32位系統,指針是4個字節寬。然後你嘗試解引用這個指針,這是內存位置0x1004的值。這可能是任何東西,如0xBAD2,所以試圖寫一個浮點值最有可能導致段錯誤。

(*floats)[1]。在這裏,您首先取消floats,即0xBADD,其類型爲float *。然後嘗試將值寫入0xBADD + 40xBAE1。這是尚未分配給您的內存,因此在那裏寫入可能會導致段錯誤。

無論哪種方式,你搞亂了不屬於你的內存,從而導致段錯誤。

+0

該數組是malloced;它是僞代碼。 – 2010-08-24 01:18:59

+0

哦..好說'float * floats = ...;'或者什麼的!在這種情況下,你會想要'(*浮動)[1]',或者直接像接受的答案那樣傳遞數組。 – Claudiu 2010-08-24 13:45:48

相關問題