4

va_arg(ap、double)を使用してこのサンプルプログラムを実行すると、va_argが無効なデータを返すことがわかりました。3ではなく0、または1ではなく1.2であるため、double形式ではなく.00なしで整数値を渡すと、ガベージが発生します。データ(つまり、3.00ではなく3)!!!

#include <stdio.h>
#include <stdarg.h>
void func(int s){
    printf("%s: %d\n",__func__,s);
}

void var(int count,...){
    va_list ap;
    va_start(ap,count);
    double a = va_arg(ap,double);
    printf("%f\n",a);
    va_end(ap);

}

void main(void ) {
    printf("%s,%d,%s\n",__FILE__,__LINE__,__DATE__);
    func(__LINE__);
    var(1,3);
    var(1,1.2);
    var(1,1);

}

出力は次のとおりです。

try.c,24,Sep 25 2012
func: 25
0.000000
1.200000
1.200000
4

2 に答える 2

3

可変個引数関数(つまり、省略記号(...)パラメーターで示される可変数の引数を取る関数)は、Cでの型指定が弱いです。printfおよびのような特定の特殊関数の場合を除いてscanf、コンパイラーはユーザーが正しいタイプの引数をそれらに渡します。

あなたの場合、関数はdoubleパラメーターを期待していますが、を渡そうとしていますintintコンパイラはここからからへの昇格を行わないdoubleため、未定義の動作が発生します。doubleここでは、などの明示的なdouble定数値として値を渡すか1.0、型キャストを使用して変換を実行する必要があります。

于 2012-09-25T17:16:37.240 に答える
1

ええと、3そして1整数であり、倍精度ではありません。これらの数値の2進表現は、およびの2進表現とは異なり3.0ます1.0

var(1,3.9);
var(1,1.2);
var(1,5.7);


$ ./a 
a.c,17,Sep 25 2012
func: 18
3.900000
1.200000
5.700000
于 2012-09-25T17:21:22.827 に答える