va函数测试

nmvbxcz 2016-12-29 08:33:42
#include <stdio.h>
#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
#define va_start(ap,v) ( ap = (char *)&v + _INTSIZEOF(v) ) //第一个可选参数地址
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) //下一个参数地址
#define va_end(ap) ( ap = (char *)0 ) // 将指针置为无效

void simple_va_fun(int i, ...)
{
char * arg_ptr;
int j=0,k=0;
va_start(arg_ptr,i);
j=va_arg(arg_ptr,int);
k=va_arg(arg_ptr,int);
va_end(arg_ptr);
printf("%d@%d@%d \n",i,j,k);
return;
}

void main()
{
simple_va_fun(5,7,9);
}

以下是使用gdb调试的结果,打印了内存,感觉传入的参数ijk并没有依次存放,而且中间间隔的单元数据还发生了改变,最终输出来的j和k都是0。
simple_va_fun (i=5) at newtest2.c:14
14 int j=0,k=0;
(gdb) p i
$1 = 5
(gdb) p &i
$2 = (int *) 0x7fffffffdcdc
(gdb) x/16uw 0x7fffffffdcdc
0x7fffffffdcdc: 5 0 0 0
0x7fffffffdcec: 0 0 0 7
0x7fffffffdcfc: 0 9 0 0
0x7fffffffdd0c: 0 4196000 0 4158552288
(gdb) p arg_ptr
$3 = 0x0
(gdb) s
15 va_start(arg_ptr,i);
(gdb) p arg_ptr
$4 = 0x0
(gdb) x/16uw 0x7fffffffdcdc
0x7fffffffdcdc: 5 0 0 0
0x7fffffffdcec: 0 0 0 7
0x7fffffffdcfc: 0 9 0 0
0x7fffffffdd0c: 0 4196000 0 4158552288
(gdb) i local
arg_ptr = 0x0
j = 0
k = 0
(gdb) s
16 j=va_arg(arg_ptr,int);
(gdb) i local
arg_ptr = 0x7fffffffdce0 ""
j = 0
k = 0
(gdb) x/16uw 0x7fffffffdce0
0x7fffffffdce0: 0 0 4294958304 32767
0x7fffffffdcf0: 0 0 7 0
0x7fffffffdd00: 9 0 0 0
0x7fffffffdd10: 4196000 0 4158552288 32767
(gdb) x/16uw 0x7fffffffdcdc
0x7fffffffdcdc: 5 0 0 4294958304
0x7fffffffdcec: 32767 0 0 7
0x7fffffffdcfc: 0 9 0 0
0x7fffffffdd0c: 0 4196000 0 4158552288
...全文
282 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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