• 在 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[]的更多相关文章

  1. int main(int argc, char** argv) 以及CommandLineParser

    参考链接: 关于int main(int argc, char** argv) http://blog.csdn.net/liuhuiyi/article/details/8239303 http:/ ...

  2. main(int argc, char **argv)参数解读

    main(int argc, char **argv)参数解读 编译生成了test.exe ,然后在控制台下相应的目录下输入:test  1  2  3 4 argc就是一个输入了多少个参数,包括te ...

  3. int main( int argc, char **argv)

    1.参数 (有时参数是void) argc是程序运行时参数个数 argv是存储参数的数组,可以用char* argv[],也可以用char **argv. 例如编译一个hello.c的程序 1 #in ...

  4. int main(int argc,char* argv[])详解

    argc是命令行总的参数个数 argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数命令行后面跟的用户输入的参数, 比如:       int   main(int   argc,   ...

  5. int main(int argc, char * argv[]) 里的异常处理

    #import <UIKit/UIKit.h> #import "AppDelegate.h" int main(int argc, char * argv[]) { ...

  6. main(int argc,char *argv[])

    #include<iostream.h> //ECHO.CPP void main(int argc,char *argv[]) { ;i<argc;i++)cout<< ...

  7. int main(int argc,char* argv[])参数详解

    argc是命令行总的参数个数 argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数 命令行后面跟的用户输入的参数,比如: int main(int argc, char* argv[] ...

  8. int main(int argc,char* argv[]) 简单理解

    (1)第一个int代表整个main函数的返回值,若函数正常执行完毕,返回0,异常返回则是-1 (2)int argc代表命令行参数的总个数,既然是个数,那就是整型的,即:int; (3)char* a ...

  9. main()函数的输入参数 main(int argc, char** argv)

    一般简单的C++程序,main函数的写法都是 int main() {... ; return 0;},但是,如果在运行程序时需要有参数输入,可以是使用将主函数写成int main(int argv, ...

随机推荐

  1. 开发常用镜像资源替换为国内开源镜像(yum,compose,maven,docker,android sdk,npm,国内开源镜像汇总)

    一.国内开源镜像站点汇总 阿里云开源镜像站 (http://mirrors.aliyun.com/)网易开源镜像站 (http://mirrors.163.com/)中国科学技术大学开源镜像站 (ht ...

  2. POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / SCU 1132 Invitation Cards / ZOJ 2008 Invitation Cards / HDU 1535 (图论,最短路径)

    POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / ...

  3. linux文件名匹配——通配符使用

    背景:在linux使用过程中,经常需要查找文件,对命令中的通配符pattern和正则表达式的区分不是很清楚.有必要好好研究一下. 1 扫盲 1.1 通配符和正则表达式 当在使用命令行时,有很多时间都用 ...

  4. python之旅:面向对象进阶

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object) ...

  5. c/c++ 判断两个实型的关系

    etc. minv=1e-10 or less x>y : x>y-minv x<y : x<y+minv x=y : fabs(x-y)<minv

  6. jedisClient操作redis实现增删改查功能

    这个集群环境下和单机环境下: package com.taotao.sso.dao.impl; import org.springframework.beans.factory.annotation. ...

  7. mysql数据库给局域网用户所有的权限

    ERROR 1698 (28000): Access denied for user 'root'@'localhost' 刚装好的服务端时必须用 sudo命令才能登录,不然就报1698的错误 然后就 ...

  8. li分两列显示

    只要控制了li的宽度,利用浮动就能实现<style type="text/css"> .my ul { width: 210px; } .my li { width: ...

  9. 《Linux命令行与shell脚本编程大全》第十一章 构建基本脚本

    11.1使用多个命令 $date;who   //  命令列表,加入分号就可以,这样会依次执行.参见5.2.1节 注意区分$(date;who),这个是进程列表,会生成一个子shell来执行 Shel ...

  10. 一个中国地图的SVG,可以带参数

    <script src="http://files.cnblogs.com/files/LoveOrHate/jquery.min.js"></script> ...