利用 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"

此字符串加上尾部的 ‘’ 共24个字符

字符指针 argv[1] 指向的地址值为 0x7fffffffe340  从此位置开始连续的内存单元用来存储 "a"

并且 0x7fffffffe340 - 0x7fffffffe328 = 0x18   转化为十进制为 24  正好是 argv[0] 指向的字符串的字节数

同理 

0x7fffffffe342 - 0x7fffffffe340 = 0x02  十进制为 2 正好是 argv[1] 指向的字符串的字节数("a"----> 共 2 个字节)

0x7fffffffe345 - 0x7fffffffe342 = 0x03  十进制为 3 正好是 argv[2] 指向的字符串的字节数("bb"----> 共 3 个字节)

下图是输出指针指向的那个字符

也可以说明 argv[] 是指向字符的字符指针

既然这四个指针被存在指针数组中  那也会有存储这几个指针的 内存

将它们的地址输出看一下

得到指针数组的内存地址

可以看到在内存中开辟了8个字节的单元来存储每个指针   因为本机是64位的   8 * 8 = 64 足够寻址了

那谁来管理它们呢??

换句话说 通过谁来找到它们呢??

答案就是 argv 这个变量   输出一下它的地址

并且在 main 开始执行时 argv 指向了存储 argv[0] 这个指针变量的地址

到此存储结构就应该搞懂了


  • 画个草图来表示一下

原文地址:https://www.cnblogs.com/xinglichao/p/9048244.html