利用 gdb 探究main(int argc, char *argv[]){} 中的char *argv[]
- 在 Linux 系统中编写小程序
代码如下
编译并采用gdb调试 在调试之前设置三个参数 a bb ccc
输入 start 执行代码到 return 0;
从这里可以看到
argc = 4 argv是一个地址值
首先查看下argv[0] ~ argv[3]
可以看到字符指针 argv[0] 指向的地址值为 0x7fffffffe328 并且从此位置开始连续的内存单元用来存储 "/home/xlc/learnc/test.o"
此字符串加上尾部的 ‘\0’ 共24个字符
字符指针 argv[1] 指向的地址值为 0x7fffffffe340 从此位置开始连续的内存单元用来存储 "a"
并且 0x7fffffffe340 - 0x7fffffffe328 = 0x18 转化为十进制为 24 正好是 argv[0] 指向的字符串的字节数
同理
0x7fffffffe342 - 0x7fffffffe340 = 0x02 十进制为 2 正好是 argv[1] 指向的字符串的字节数("a\0"----> 共 2 个字节)
0x7fffffffe345 - 0x7fffffffe342 = 0x03 十进制为 3 正好是 argv[2] 指向的字符串的字节数("bb\0"----> 共 3 个字节)
下图是输出指针指向的那个字符
也可以说明 argv[] 是指向字符的字符指针
既然这四个指针被存在指针数组中 那也会有存储这几个指针的 内存
将它们的地址输出看一下
得到指针数组的内存地址
可以看到在内存中开辟了8个字节的单元来存储每个指针 因为本机是64位的 8 * 8 = 64 足够寻址了
那谁来管理它们呢??
换句话说 通过谁来找到它们呢??
答案就是 argv 这个变量 输出一下它的地址
并且在 main 开始执行时 argv 指向了存储 argv[0] 这个指针变量的地址
到此存储结构就应该搞懂了
- 画个草图来表示一下
最新文章
- 北大poj-1091
- redis参数优化
- Firefox刷新页面和复选框的奇葩问题
- NHibernate系列文章二十六:NHibernate查询之SQL Query查询(附程序下载)
- 使用openssl创建自签名证书及部署到IIS教程
- ZXing二维码的生成和解析
- CentOS网卡配置文件
- python: linux下安装redis
- Java中toArray的用法探究(java数组与list转换)
- error: The shader requires a sampler in slot 0 which hasn't been set [XXXsampler]
- 磁盘IO性能监控(Linux 和 Windows)
- [LeetCode]题解(python):122-Best Time to Buy and Sell Stock II
- 关于DLL搜索路径顺序的一个问题
- 基于三星ARM9(S3C2410)的交通违章抓拍系统的开发
- 结构-行为-样式-angularJs ngAnimate(Js实现)
- Swift数组的迭代访问
- MIRO做发票校验时实现替代功能的多种方式
- WebRoot 与 webContent的区别
- 意识科学初步:David Chalmers的简单问题与困难问题
- nginx替换响应头(重点:如何在替换时加上if判断)