0

私はこのような機能を持っています

void some_func(some_type *var)
{
    // do something a get a var2 of type some_type*
    var = var2;
}

そして主に私は持っています

some_type *var;
some_func(var);
print_var(var);

しかし、プログラムを実行するとセグメンテーション違反が発生します。デバッグはprint_var、あたかもvar価値がないかのように、それが問題であることを示しています。var2を使用して初期化されるnew some_typeため、 に対してこれを行う必要はないと思いますvar

しかしvar = new some_type、メインで実行し、で手動でクローン (の各データをコピーvar2)varするとsome_func、エラーは発生しません。

私の問題はどこですか?私はポインターとメモリ割り当てにあまり慣れていませんが、両方の方法が機能するはずです。私が間違っている?

おそらく主な問題はnew、関数で使用してポインターを割り当て、そのアドレスをポインターの引数に保持する場合、関数が終了するとメモリの割り当てが解除されるかどうかです。

4

3 に答える 3

3

定義を次のように変更する必要があります。

    void some_func(some_type*& var)
    {
        // var will also be changed on the caller side
        var = var2; 
    }

呼び出し先がポインターの値を更新できるように、ポインターへの参照を渡すことに注意してください。

于 2013-08-03T01:21:24.723 に答える
1

あなたのsomeType *varinmain()は main に対してローカル*varであり、関数の in はその関数に対してローカルです。

そのため、varin 関数は指してvar2いますが、main に存在するものではありません。

于 2013-08-03T01:23:01.713 に答える
1

あなたは値渡しをvarしています。これは、 のコピーがin mainvarとは別にスタック上に作成されることを意味します。var次に、このコピーは で初期化されvar2ます。ただし、some_func終了すると、スタックがポップされ、コピーが失われます。varmain で宣言された は変更されません。

これを修正するための 1 つの可能な方法はsome_func、 に代入できるポインター値を返すことvarです。

または、宣言をに変更some_funcします

void some_func(some_type *& var)

これはvar参照によって渡されます。つまり、関係するすべての点で、varinsome_funcは in と同じvarですmain

于 2013-08-03T01:26:54.993 に答える