”stdarg荤解释

G

Guest

Guest
嗨,

任何人都可以帮助我解释代码?

代码:

廉政varfunc(字符*缓冲带,廉政身份证,...)



va_list标签;

va_start(标签,身份证);如果(编号== 0)



= 0,结果= 0字符一;廉政arg1;

字符* arg2;

字符arg3;arg1 = va_arg(标签中,INT); / / 27(1Bh)在廉政地址= 0x1B00

arg2 = va_arg(标签,烧焦*);

arg3 = va_arg(标签,字符);arg1 = arg1 0x02; / / arg1 = 0x0008???而(arg2 [我] ='\ 0')/ / arg2 [] =(0)????



结果= arg2 [一];

一 ;



arg3 = arg3 * 0x02; / / arg3 = 0???)

其他的



= 0,结果= 0;字符的I / /静态变量字符* arg1;

字符* arg2;

字符arg3;arg1 = va_arg(标签,烧焦*);

arg2 = va_arg(标签,烧焦*);

arg3 = va_arg(标签,字符);

*丁咯= '1';arg1 =“01”;

arg2 =“9876”;

arg3 = 100;而(arg1 [我] ='\ 0')



结果= arg1 [一];

一 ;



= 0;

而(arg2 [我] ='\ 0')



结果= arg2 [一];

一 ;



arg3 = arg3 * 0x02; / / arg3 = 0x06????



)无效来电(无效)



字符tmp_buffer [10];varfunc(tmp_buffer,0,4,“测试代码”,2);

varfunc(tmp_buffer,1,“测试”,“守则”,3);


 
尝试让您所有的编译器的警告消息和重新编译。该信息将有助于您的调试。
最大的麻烦喔缺少头文件时,arg3不匹配的类型和失踪va_end。

在MinGW的工作
, 这对我来说海合会3.4.2:
代码:

#包括<stdio.h>

#包括<stdarg.h>廉政varfunc(字符*缓冲带,廉政身份证,...)



va_list标签;

va_start(标签,身份证);如果(编号== 0)



廉政arg1;

字符* arg2;

字符arg3;arg1 = va_arg(标签中,INT);

arg2 = va_arg(标签,烧焦*);

arg3 = va_arg(标签中,INT);printf(“编号== 0:%d个%s%d个\ N”的,arg1,arg2,arg3);



其他的



字符* arg1;

字符* arg2;

字符arg3;arg1 = va_arg(标签,烧焦*);

arg2 = va_arg(标签,烧焦*);

arg3 = va_arg(标签中,INT);printf(“身份证!= 0:%硫%š%d个\ N”的,arg1,arg2,arg3);



va_end(标签);

返回0;

)廉政主体(无效)



字符tmp_buffer [10];varfunc(tmp_buffer,0,4,“测试代码”,2);

varfunc(tmp_buffer,1,“测试”,“守则”,3);

返回0;


 
嗨,

我可以用此方法模拟的结果...为arg1 = arg1 2,我只是想看到的结果
, 但是如果我这样做
, 我不能得到的结果arg1 = 6。我认为有几个arg2和arg3也是同样的问题。为什么?

以及为什么arg3类型是'廉政'?

我使用Keil编译
, 但我认为是相同的...因为它是一般的代码,是吗?

谢谢您。

 
'字符'升级为'廉政'当通过'...',通过让您的varfunc()函数必须期待一个'廉政'。一个不匹配的参数
, 它可以破坏他们。

我不明白你的一句关于模拟。

如果凯尔是ANSI C标准(我不知道这是否是),那么也应做按标准C语言。

 
嗨,

echo47说:

'字符'升级为'廉政'当通过'...',通过让您的varfunc()函数必须期待一个'廉政'。
一个不匹配的参数,它可以破坏他们。
 
是的,如果你调用函数传递'字符在arg3',它就会被晋升为'廉政',所以你必须指定'廉政'在你的va_arg()。

不,如果你的调用函数传递和'廉政在arg3',它仍是一个'廉政'。它没有得到晋升为'长'。

是的,您可以像使用普通函数参数的三个参数。我用printf只是因为我想该程序的输出明显成效。

请参考优秀的C一书
, 介绍了如何使用可变数量的参数。您可能还会发现一些comp.lang.c常见问题的答案。尤其是,这一个:
http://c-faq.com/varargs/float.html

 

Welcome to EDABoard.com

Sponsor

Back
Top