1

私の問題には、次の機能が含まれます。

/*Adds the transaction to the head of the linked list attached to the account.*/
void Bank::Worker::UpdateTransactionHistory(int account_number, string transaction, Bank *our_bank_ptr) {

    transaction_node new_trans;
    new_trans.transaction = transaction;

    if (our_bank_ptr->accounts[account_number].head == nullptr) {   //If this is the first transaction
        our_bank_ptr->accounts[account_number].head = &new_trans;

    } else {    //If this isn't the first transaction, disconnect the account from its current transaction list, connect the new transaction to the account and then connect the old list to the new transaction.
        transaction_node temp;
        temp = *(our_bank_ptr->accounts[account_number].head);

        our_bank_ptr->accounts[account_number].head = &new_trans;

        new_trans.next = &temp;
    }

if (our_bank_ptr->accounts[account_number].head) //here the correct string is printed
            cout << our_bank_ptr->accounts[account_number].head->transaction;
}

これは、new_trans のトランザクション フィールドを更新することを意図しており、特定のアカウントの残りのトランザクション リストにリンクされます。更新トランザクション関数から戻る直前に、文字列が正しく追加されたことを確認するためにテストします。関数の最後の行はcout << our_bank_ptr->accounts[account_number].head->transaction;、トランザクション文字列を正しく出力する です。

しかし、関数から戻ってすぐにまったく同じコード行を呼び出すと、コンパイラは、関数が更新したトランザクション フィールドがまだ初期化されていないことを通知します。これは、ポインターとして渡されたという事実にもかかわらずです。

一体何!? ポインターを介して関数に情報を渡すと、関数の過程でその情報に対して行ったことは永続的であると思いましたか? ここで何が欠けていますか?

お手伝いありがとうございます、

アダム

4

1 に答える 1

1

ローカル変数 ( ) を指すようにポインターを設定していますnew_trans。関数が終了すると、この変数は破棄され、ポインターはぶら下がります。したがって、逆参照しようとすると、未定義の動作が発生します。あなたの場合、これは現在、ユニット化された印刷として現れます。しかし、それ以外のこともできます。

そこにポインターが必要で、それらが永続的な値を指す必要がある場合は、値を動的に割り当てる必要があります。しかし、本当の問題は次のとおりです。ポインタが必要ですか?

于 2013-10-29T14:44:11.097 に答える