逍遥 发表于 2014-9-30 13:11:20

变元可变的函数的问题

int add(int q,int w,...);

void main()
{
        int aa = 0, a=1, b = 2, c = 3, d = 4, e =5;
        aa = add(a,b,c,d,e);
        printf("aa=%d\n",aa);

       
}
int add(int q, int w, ...)
{
        va_list qq;
        int j;
        int tt;
        int t=0, x = 0;
        char *ww=0;       //这是我测试加上去了一下代码;
        ww = va_start(qq, w);   
      tt = sizeof(int);             //int是4字节,为什么地址上加的是8字节,
        while(t = va_arg(qq,int) != 0) //每执行一次qq指针指向的地址第增的是8字节;而且这个循环只执行2次;
        {
                x += t ;
        }
        va_end(qq);
        return x;
}
我想执行的是12+3+4+5的答案,可输出的是4,这是为什么那?



_DEBUG 发表于 2014-9-30 13:11:21

① t = va_arg(qq,int)应加上括号。
② 前两个参数没有加入和中。
③ 函数的实现约定了以0结尾,但调用时却不以0结尾,不但得不到想要的结果,还容易发送越界访问。
④ 递增的是8字节,用的什么编译器?

逍遥 发表于 2014-9-30 21:24:08

_DEBUG 发表于 2014-9-30 20:04
① t = va_arg(qq,int)应加上括号。
② 前两个参数没有加入和中。
③ 函数的实现约定了以0结尾,但调用时 ...

while((t = va_arg(qq,int)) != 0) 在这加个挂号后,地址是4字节第增,不过访问到溢出了,不加挂号不会溢出,用的是VC++ 6.0编译器

逍遥 发表于 2014-9-30 21:25:47

逍遥 发表于 2014-9-30 21:24
while((t = va_arg(qq,int)) != 0) 在这加个挂号后,地址是4字节第增,不过访问到溢出了,不加挂号不会溢 ...

索引从3开始往后索引,直到溢出停止索引 输出的是一个垃圾数据

_DEBUG 发表于 2014-10-1 09:03:55

逍遥 发表于 2014-9-30 21:25
索引从3开始往后索引,直到溢出停止索引 输出的是一个垃圾数据

请再次查看第二、第三点。

逍遥 发表于 2014-10-1 13:44:20

_DEBUG 发表于 2014-10-1 09:03
请再次查看第二、第三点。

谢谢!在调用函数的时候 “aa = add(a,b,c,d,e,0)”这样实现了,是不是每用这样的函数都要用来结尾???

_DEBUG 发表于 2014-10-1 16:38:08

对,再把q、w加上……
页: [1]
查看完整版本: 变元可变的函数的问题