博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c语言可变参数相关的宏
阅读量:6259 次
发布时间:2019-06-22

本文共 982 字,大约阅读时间需要 3 分钟。

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"

 

转载于:https://www.cnblogs.com/sgy1993/p/8724878.html

你可能感兴趣的文章
win7(windows 7)系统下安装SQL2005(SQL Server 2005)图文教程
查看>>
Hibernate的基本配置
查看>>
Python 3.5 安装geohash库后import geohash失败
查看>>
总结100个英文邮件常用例句让你写作无忧
查看>>
css3--之backface-visibility
查看>>
软件需求分析之猫咪记单词
查看>>
good vs evil
查看>>
算法28-----范围求和
查看>>
基于V4L2的视频驱动开发(1)
查看>>
zoj 1008
查看>>
VC++ CArchive及简单的文件操作方法
查看>>
使用canvas制作一个移动端画板
查看>>
android中ListView数据混乱问题
查看>>
QT学习-10/31/2012
查看>>
jQuery File Upload
查看>>
bbb板运行rtems-编写led底层驱动
查看>>
如何从零安装Mysql
查看>>
Appium简介及工作原理
查看>>
IP 类型转换
查看>>
mysql实践1
查看>>