2011-11-04 104 views
0

很奇怪的行爲,我有一個簡單的函數:與數組聲明

DoRead(double *writeArray){ 
//GblOutData is an array of length 80, where each element is 1 
    writeArray=GblOutData; 
//prints out 1 
    printf("%f",writeArray[5]); 
    return 0; 
    } 

當我打電話DoRead()會發生什麼:

double data[80];  
DoRead(data); 
printf("%f",data[5]); 
//prints out 0.000000 instead of 1 

我想不通爲什麼發生這種情況。有任何想法嗎?

+2

因爲你從來沒有設置'數據[5]'爲1?僅供參考,當您執行'writeArray = GblOutData;'時,您不會更改函數外部的參數,您只是更改函數內的指針,實際上只是打印'GblOutData [5]'。 –

+0

@SethCarnegie你是對的!當我只是手動設置writeArray [5] = 1 – mugetsu

回答

6

所有該行

writeArray=GblOutData; 

確實是改變功能DoRead()內的可變writeArray的含義。當它返回時,外部變量數據沒有改變。您想複製的內容,可能與memcpy:

memcpy(writeArray, writeArray=GblOutData, 80*sizeof *writeArray); 
+0

當然,你需要始終確保兩個數組的大小相同。當這個程序長大後,這將是一個問題。 – drdwilcox

1

您需要將地址傳遞給數據。一個解決方案可以(但我個人不會這樣做):

DoRead(double **writeArray){ 
*writeArray=GblOutData; 
    .... 
} 

DoRead((double**) &data); 
+0

不幸的是,我不能自由地改變參數在DoRead中的設置/調用方式,但是我可以在函數內部做任何我想做的事情。 – mugetsu

+0

*可能不是*他在這種情況下想要做的事情,因爲他已經在外部分配了一個陣列。 – Boann

+0

我會去用drdwilcox解決方案,用memcpy。無論如何,我只是試圖證明發生了什麼。 – Fred