0

おはようございます、私は現在、私が始めたばかりの言語である標準 C を使用する Pebble Smartwatch 用のアプリに取り組んでいます。

Money トランザクションを配列に追加する関数があります。私は次のようにトランザクションを定義しました:

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 ユーロになります。

私は何を間違っていますか?助けていただければ幸いです。:)

4

1 に答える 1

4

dict_find関数はメモリを割り当てないように見えますが、value->cstring呼び出しごとに同じバッファを使用します。したがって、配列内の構造体は同じメモリへのポインターになりdict_find、それを変更すると、すべての配列エントリが変更されます。

于 2014-03-12T10:18:19.057 に答える