鱼C论坛

 找回密码
 立即注册
查看: 2385|回复: 6

变元可变的函数的问题

 关闭 [复制链接]
发表于 2014-9-30 13:11:20 | 显示全部楼层 |阅读模式
10鱼币
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,这是为什么那?



最佳答案

查看完整内容

① t = va_arg(qq,int)应加上括号。 ② 前两个参数没有加入和中。 ③ 函数的实现约定了以0结尾,但调用时却不以0结尾,不但得不到想要的结果,还容易发送越界访问。 ④ 递增的是8字节,用的什么编译器?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-30 13:11:21 | 显示全部楼层
① t = va_arg(qq,int)应加上括号。
② 前两个参数没有加入和中。
③ 函数的实现约定了以0结尾,但调用时却不以0结尾,不但得不到想要的结果,还容易发送越界访问。
④ 递增的是8字节,用的什么编译器?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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编译器
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

索引从3开始往后索引,直到溢出停止索引 输出的是一个垃圾数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-10-1 09:03:55 | 显示全部楼层
逍遥 发表于 2014-9-30 21:25
索引从3开始往后索引,直到溢出停止索引 输出的是一个垃圾数据

请再次查看第二、第三点。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-10-1 13:44:20 | 显示全部楼层
_DEBUG 发表于 2014-10-1 09:03
请再次查看第二、第三点。

谢谢!在调用函数的时候 “aa = add(a,b,c,d,e,0)”这样实现了,是不是每用这样的函数都要用来结尾???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-10-1 16:38:08 | 显示全部楼层
对,再把q、w加上……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 02:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表