利用 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] 这个指针变量的地址
到此存储结构就应该搞懂了
- 画个草图来表示一下
利用 gdb 探究main(int argc, char *argv[]){} 中的char *argv[]的更多相关文章
- int main(int argc, char** argv) 以及CommandLineParser
参考链接: 关于int main(int argc, char** argv) http://blog.csdn.net/liuhuiyi/article/details/8239303 http:/ ...
- main(int argc, char **argv)参数解读
main(int argc, char **argv)参数解读 编译生成了test.exe ,然后在控制台下相应的目录下输入:test 1 2 3 4 argc就是一个输入了多少个参数,包括te ...
- int main( int argc, char **argv)
1.参数 (有时参数是void) argc是程序运行时参数个数 argv是存储参数的数组,可以用char* argv[],也可以用char **argv. 例如编译一个hello.c的程序 1 #in ...
- int main(int argc,char* argv[])详解
argc是命令行总的参数个数 argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数命令行后面跟的用户输入的参数, 比如: int main(int argc, ...
- int main(int argc, char * argv[]) 里的异常处理
#import <UIKit/UIKit.h> #import "AppDelegate.h" int main(int argc, char * argv[]) { ...
- main(int argc,char *argv[])
#include<iostream.h> //ECHO.CPP void main(int argc,char *argv[]) { ;i<argc;i++)cout<< ...
- int main(int argc,char* argv[])参数详解
argc是命令行总的参数个数 argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数 命令行后面跟的用户输入的参数,比如: int main(int argc, char* argv[] ...
- int main(int argc,char* argv[]) 简单理解
(1)第一个int代表整个main函数的返回值,若函数正常执行完毕,返回0,异常返回则是-1 (2)int argc代表命令行参数的总个数,既然是个数,那就是整型的,即:int; (3)char* a ...
- main()函数的输入参数 main(int argc, char** argv)
一般简单的C++程序,main函数的写法都是 int main() {... ; return 0;},但是,如果在运行程序时需要有参数输入,可以是使用将主函数写成int main(int argv, ...
随机推荐
- HDU 4303 Hourai Jeweled 解题报告
HDU 4303 Hourai Jeweled 解题报告 评测地址: http://acm.hdu.edu.cn/showproblem.php?pid=4303 评测地址: https://xoj. ...
- M公司的回忆录——L公司
2013年3月笔者回国的第一站便是这人称有福之州的福州.受我兄弟之邀笔者来到了L公司.而这也是笔者与M公司相遇的前缘.此时的L公司只是一个刚起步的创业公司.与所有创业公司一样子——创业初期存在着很多问 ...
- Linux系统下/tmp目录文件重启后自动删除,不重启自动删除10天前的/TMP的文件(转)
/tmp目录文件重启后自动删除现在知道有ubuntu和solaris系统source:http://blog.chinaunix.net/uid-26212859-id-3567875.html经常会 ...
- python XML梳理
导入ElementTree模块 import xml.etree.ElementTree as ET 为了创建一个element实例,使用Element 构造函数或者SubElement()工厂函数. ...
- Java基础-SSM之Spring和Mybatis以及Spring MVC整合案例
Java基础-SSM之Spring和Mybatis以及Spring MVC整合案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 能看到这篇文章的小伙伴,详细你已经有一定的Java ...
- angularJs的继承
为什么要继承,本来是后端的概念,但是同样适用于前端开发.继承,无疑是将通用的东西抽取出来. 下面介绍的是angular的伪继承,就是说是通过继承scope这个变量来实现的.代码很简单,一行代码就可以. ...
- Spark记录-官网学习配置篇(二)
### Spark SQL Running the SET -v command will show the entire list of the SQL configuration. #scala/ ...
- bzoj千题计划270:bzoj4559: [JLoi2016]成绩比较(拉格朗日插值)
http://www.lydsy.com/JudgeOnline/problem.php?id=4559 f[i][j] 表示前i门课,有j个人没有被碾压的方案数 g[i] 表示第i门课,满足B神排名 ...
- Linux命令(八)Linux系统信息相关命令
top:
- 英文写作指南——《“compare to”等同“compare with”吗?》