可变参数表为空时,va_start()的问题

Yi_mii 2010-12-06 11:55:10

int testError(int i, ...)
{
va_list arg_ptr;
va_start(arg_ptr, i);
va_end(arg_ptr);
return 0;
}

int main()
{
testError(1);
return 0;
}

以上代码va_start()取到的arg_prt应该是什么?
vs2003环境
win2000下执行结果是空指针,winXP下执行结果是野指针……
...全文
312 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
实现版本不同
xiaozhi5855 2010-12-06
  • 打赏
  • 举报
回复
Access variable-argument lists.


type va_arg(
va_list arg_ptr,
type
);
void va_end(
va_list arg_ptr
);
void va_start(
va_list arg_ptr
); // (UNIX version)
void va_start(
va_list arg_ptr,
prev_param
); // (ANSI version)



Parameters
type
Type of argument to be retrieved.

arg_ptr
Pointer to list of arguments.

prev_param
Parameter preceding first optional argument (ANSI only).

自己看
OnMyWay2010 2010-12-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 yi_mii 的回复:]
C/C++ code

int testError(int i, ...)
{
va_list arg_ptr;
va_start(arg_ptr, i);
va_end(arg_ptr);
return 0;
}

int main()
{
testError(1);
return 0;
}


以上代码va_st……
[/Quote]
arg_prt应该是(&i + 1)
Yi_mii 2010-12-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 akirya 的回复:]

引用 7 楼 yi_mii 的回复:

引用 5 楼 akirya 的回复:

栈上的数据
不可预料,看具体运行环境。

可变部分的参数表为空时,arg_ptr是不是应该为空指针才比较合理呢……


无法做到,testError不可能知道 传进去了多少个参数。
[/Quote]
确实……不安全
只能从传入的固定参数部分,如int i,来获取参数个数的信息了
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yi_mii 的回复:]

引用 5 楼 akirya 的回复:

栈上的数据
不可预料,看具体运行环境。

可变部分的参数表为空时,arg_ptr是不是应该为空指针才比较合理呢……
[/Quote]

无法做到,testError不可能知道 传进去了多少个参数。
Yi_mii 2010-12-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 binqray 的回复:]

实现版本不同
[/Quote]
嗯……
但是不知道预期结果就没法规避错误
Yi_mii 2010-12-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 akirya 的回复:]

栈上的数据
不可预料,看具体运行环境。
[/Quote]
可变部分的参数表为空时,arg_ptr是不是应该为空指针才比较合理呢……
Yi_mii 2010-12-06
  • 打赏
  • 举报
回复
好吧,我没描述清楚。不过回复过的贴子又不让改了,蛮讨厌的。

int testError(int i, ...);
如果这样调用「 testError(1, 2);」。那么语句「 va_start(arg_ptr, i); 」初始化后arg_ptr指向 ... 部分的参数表。
如果这样调用「 testError(1);」呢? ... 部分的参数表是空的,那么语句「 va_start(arg_ptr, i); 」初始化后arg_ptr是指向?

C99标准里并没有给va_start()初始化后arg_ptr的值作明确定义,只说:The va_start macro initializes ap for subsequent use by va_arg and va_end.
MSDN上也没有指明可变部分的参数表为空时arg_ptr是指向什么。
而实际运行时在win2000环境下arg_ptr是个空指针,winXP环境下arg_ptr是个指向随机的内存。

但愿描述清楚了……,不知道有没有同志遇到过类似的情况。
  • 打赏
  • 举报
回复
栈上的数据
不可预料,看具体运行环境。
赵4老师 2010-12-06
  • 打赏
  • 举报
回复
单步调试和设断点调试是程序员必须掌握的技能之一。
libinfei8848 2010-12-06
  • 打赏
  • 举报
回复
未初始化的情况下,系统给的初始值都不一样?

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧