1 typedef char *va_list;----这个其实就是char *, 代表所指向的数据是一个字节 2 3 现在是这个函数是可变参数 4 定义如下 5 void demo(char *fmt, ...) 6 demo("DEMO", "This", "is", "a", "demo!" ,"333333", "/0"); 7 fmt指向 DEMO, fmt的值是 DEMO字符串的地址.. 8 9 va_start(ap, fmt)----------ap = &fmt + sizeof(fmt), 即ap的值是 fmt 的地址 加上 sizeof(fmt)10 这里 传递进来的形参 是fmt ,是通过栈来进行传递的, fmt的地址假如是 10011 12 那么 栈的形式就是13 14 100: fmt(也就是"DEMO的地址值")15 104: "THIS"字符串地址的值16 17 所以上面 va_start 的 ap 是 在 &fmt 偏移一个指针占据的值,也就是4字节18 Breakpoint 1, demo (fmt=0x80487b2 "DEMO") at exam.c:13219 132 va_start(ap, fmt);20 (gdb) p /x &fmt-------fmt本身的存储地址, 也就是栈21 $1 = 0xbffff65022 (gdb)
接下来执行 s 单步 执行
va_start(ap, fmt);
显示 此时 ap 的值
1 (gdb) p /x ap2 $2 = 0xbffff654----正好是 &fmt 加上一个指针的长度, 即这个里面存储的内容 保存的应该是 "THIS"字符串的地址3 (gdb)
验证 一下我们的猜想是不是正确的,
0xbffff654地址处的值是多少 -----
1 (gdb) x 0xbffff6542 0xbffff654: 0x080487ad
我们把 0x080487ad 地址处的内容当成字符串打印出来,看一看是不是"THIS"
1 (gdb) x /s 0x080487ad2 0x80487ad: "This"