1

次のコードを参照してください。

import core.vararg, std.stdio;

void main() {
    foo(1);
}

void foo(...) {
    va_list arguments;
    for(int i; i<10; ++i) {
        va_copy(arguments, _argptr);
        writeln(arguments," ", va_arg!(int)(arguments));
    }
}

出力:

7FFF61F21AE0 1
7FFF61F21AE0 0
7FFF61F21AE0 4387892
7FFF61F21AE0 0
7FFF61F21AE0 38
7FFF61F21AE0 1643256688
7FFF61F21AE0 4387915
7FFF61F21AE0 1
7FFF61F21AE0 27734032
7FFF61F21AE0 1005847240

ご覧のとおり、var_arg はガベージを生成しています。ただし、最初の呼び出しは常に正しい値を返します。

ここで何が問題なのですか?core.vararg のソース コードは非常に単純で、7FFF61F21AE0 の基になるデータを変更するものを見つけることができませんでした。

4

1 に答える 1

2

7FFF61F21AE064 ビット アドレスのように見えます。X86 以外のプラットフォームではcore.vararg、その実装を に転送することに注意してください。core.stdc.stdarg

64 ビットの実装はこちら: https://github.com/D-Programming-Language/druntime/blob/master/src/core/stdc/stdarg.d#L84

この例のコードの明らかな説明は、モジュールが正しく使用されていない (va_start呼び出しなし) ことだと思います。

于 2012-07-11T13:11:22.630 に答える