利用 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, ...
随机推荐
- 【ARC082D】Sandglass
Description 题目链接 Description 好题.题意是维护一个初始值,交替加减一段时间,有上界\(m\)和下界0(不能超过这两条界限),问对于某一种初始值,在某一个时刻时该值为 ...
- 前端学习 -- Css -- 内联元素的盒模型
内联元素不能设置width和height: 设置水平内边距,内联元素可以设置水平方向的内边距:padding-left,padding-right: 垂直方向内边距,内联元素可以设置垂直方向内边距,但 ...
- Oracle表字段类型更改的一个经验
先前表中ID字段类型是用序列,由于安全问题,需要处理水平权限的漏洞,虽然使用加密也可以处理,为了更方便,需要将字段类型改为Guid,如果表中已经有数据,更改起来不是很方便,对于基础数据表,这里提供一个 ...
- C/S与B/S区别
1.什么是C/S结构C/S (Client/Server)结构,即客户机和服务器结构.它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现, ...
- python高级特性和高阶函数
python高级特性 1.集合的推导式 列表推导式,使用一句表达式构造一个新列表,可包含过滤.转换等操作. 语法:[exp for item in collection if codition] if ...
- MyEclipse设置字体和背景的方法
可以根据自己喜好设置MyEclipse工作空间中的字体和背景颜色. 1.选择菜单Window→Preferences. 2.设置字体的方法.选择General→Appearance→Colors an ...
- CSS3 Day1 练习
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- python 基础 元组()
# 元组 应用场景 # 尽管 Python的列表中可以存储不同类型的数据 # 但是在开发中,更多的应用场景是 # 1.列表存储相同类型的数据 # 2.通过迭代遍历,在循环体内部,针对列表中的每一项元素 ...
- unp的hello word
最近无聊,再学学unp吧.学学网络编程.下面是一个demo: intro/daytimetcpcli.c #include "unp.h" int main(int argc, c ...
- Android学习笔记——从源码看Handler的处理机制
可能是出于性能的考虑,Android的UI操作是非线程安全的. 也就是说,如果你在一个新开的线程中直接操作UI是会引发异常的. 但是,Android又规定,不要去阻塞UI线程!否则,轻者引起程序卡顿, ...