2014-03-12 59 views
0

早上好, 我目前正在開發Pebble Smartwatch應用程序,該應用程序使用標準C語言,這是我剛開始使用的一種語言。C - 在陣列混淆中存儲結構

我有一個函數可以將Money Transaction添加到數組中。我已經確定的交易是這樣的:

struct Transaction { 
    char * title; 
    char * amount; 
    char * date; 
    char * text; 
} txnsArray[20]; 
每當我收到它在使用此功能添加到txnsArray交易

void addTransaction(DictionaryIterator * txnIter){ 
    Tuple *txnTitle_Tuple = dict_find(txnIter, TRANSACTION_TITLE); 
    Tuple *txnAmount_Tuple = dict_find(txnIter, TRANSACTION_AMOUNT); 
    Tuple *txnText_Tuple = dict_find(txnIter, TRANSACTION_TEXT); 


    txnsArray[transOverview.txnCounter].title = txnTitle_Tuple->value->cstring; 
    txnsArray[transOverview.txnCounter].amount = txnAmount_Tuple ->value->cstring; 
    txnsArray[transOverview.txnCounter].text = txnText_Tuple->value->cstring; 

    transOverview.txnCounter++; 

} 

現在,當我檢查這個數組它確實增加了條目,因爲它應該但是,我添加的最後一個交易適用於所有條目。

說我首先添加一筆交易,他的金額爲2.5€,然後另一筆交易的金額爲4.0€,那麼這兩個條目將有4.0€。

我在做什麼錯?非常感謝幫助。 :)

+1

此代碼有可能_undefined behaviour_關於它的味道。嘗試'txnsArray [transOverview.txnCounter] .amount = malloc(strlen(txnAmount_Tuple - > value-> cstring)+ 1); strcpy(txnsArray [transOverview.txnCounter] .amount,txnAmount_Tuple - > value-> cstring);'確保實際複製_char_值,而不僅僅是將mem地址分配給 –

+0

!就是這樣。非常感謝你:] – JohannesRu

+0

好吧,我繼續前進,並發表評論作爲你的問題的答案。可能值得一讀,因爲我建議你不要使用'strcpy',而採用'memcpy',或者如果需要的話,'strncpy' –

回答

4

它看起來像dict_find函數不爲value->cstring分配內存,但爲每個調用使用相同的緩衝區。因此數組中的結構最終會指向相同的內存,如果修改它,它會修改所有數組條目。