我知道我们如何使用这个参数,甚至知道如何使用它。
但有一件事情我仍然不明白。程序如何为来自输入的字符串分配内存?在程序开始时,**argv没有分配的内存,是吗?我本来期望会出现段错误,但实际上并没有发生。
有人知道这个内存分配是如何工作的吗?
我知道我们如何使用这个参数,甚至知道如何使用它。
但有一件事情我仍然不明白。程序如何为来自输入的字符串分配内存?在程序开始时,**argv没有分配的内存,是吗?我本来期望会出现段错误,但实际上并没有发生。
有人知道这个内存分配是如何工作的吗?
C/C++运行时处理命令行参数并创建一个内存区域,用于存放这些参数。然后调用你的main()
函数,并向其提供参数的数量和存储参数的区域指针。
因此,C/C++运行时拥有分配的内存区域,而由C/C++运行时来释放该区域,一旦你的main()
函数返回或使用其他停止程序的C/C++函数(如exit()
)。
这种过程起源于在Unix下使用C,并作为提供C++委员会试图维护的向后兼容性的一部分保留了下来。
通常情况下,当程序加载时,由加载器启动的入口点不是你的main()
函数,而是在C/C++运行时中定义的入口点。C/C++运行时进行各种初始化,以设置C/C++标准指定在初始化完成后调用main()
函数时将存在的环境。
在此初始化过程中的一步是解析所提供的命令行参数,然后将其作为函数参数提供给main()
函数。
argv
中的指针都是有效的,并且指向可以安全访问的内存。你期望哪段代码会产生segfault? - Wyzardmain()
函数之前,它由运行时库分配。 - Paul Roub