• 利用 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] 这个指针变量的地址

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


    • 画个草图来表示一下

  • 相关阅读:
    《构建之法阅读笔记02》
    《人月神话阅读笔记01》
    第四周学习进度条
    子数组2
    敏捷开发方法综述
    子数组1
    第三周学习进度条
    四则运算3
    第二周学习进度条
    四则运算4
  • 原文地址:https://www.cnblogs.com/xinglichao/p/9048244.html
Copyright © 2020-2023  润新知