操作系统在哪里存储命令行参数?

Posted

技术标签:

【中文标题】操作系统在哪里存储命令行参数?【英文标题】:Where does the OS store the command line arguments? 【发布时间】:2011-12-05 09:43:02 【问题描述】:

我在 Linux 上工作。命令行参数存储在内存的哪个部分(堆栈或堆)?

我尝试执行free(argv),但遇到了分段错误。这是为什么呢?

【问题讨论】:

我会假设它们存储在堆栈中(在调用 main 之前),所以你不应该真的弄乱它们的内存! 为什么重要?你为什么不检查地址? :// @yi_H:我如何通过地址推断部分? @yi_H - 这对好奇的头脑很重要。好的初学者应该一直问这些问题。在这件事上,文档可能过于枯燥,因此必须求助于导师。 @Leonardo Herrera:这是一个反问。也许对于初学者来说是这样,但专业人士必须知道在哪里划清界限。现代计算机系统太复杂了,无法了解每一个小细节。只要没关系,知道它有什么意义? 【参考方案1】:

我尝试执行 free(argv),但出现分段错误。这是为什么呢?

你只能free 你的malloc/calloc (以后可能还有realloc)。尝试free 其他东西会调用未定义的行为。 UB 表现出来的一种(好的)方式是产生分段错误;一种(不好的)方法是让程序看起来像预期的那样工作。

至于他们在哪里...阅读C99 Standard 的第 5.1.2.2.1 节——它的未指定

argv 数组所指向的字符串应 可由程序修改,并在程序之间保留它们最后存储的值 启动和程序终止。

【讨论】:

@Bruce:所以argv 指向某个地方,你永远不知道也不能依赖。 argv 指向一组指针。每个指针argv 指向编译器放置它们的位置(您可以尝试阅读编译器的源代码或询问开发人员)。 argv 中的指针所指向的每一个东西都驻留在编译器放置它们的位置。 @pmg:请有人告诉我 argv 指向哪里。它杀了我。 #include <stdio.h> / int main(int argc, char **argv) printf("%p\n", (void*)argv); return 0; 结果为 0x7fff0a8a9318。这就是argv 指向的地方:0x7fff0a8a9318记住这一点:) Argv 通常位于堆栈上(或附近)。存储在堆栈区域中的任何内容都不是由您显式初始化(​​例如未初始化的变量)或用于控制目的(例如堆栈保留其 ebp 或 esp 的位置)将是垃圾:一些可能是任何东西的数字,并且,当在 free() 中使用它时用作内存位置,因此可以指向任何地方。这只是响应它指向的位置。当你 free() 之前没有 malloc() 的东西已经得到回答时会发生什么。【参考方案2】:
我正在使用 Linux。命令行参数存储在内存的哪个部分(堆栈或堆)?

这取决于实施;检查您的编译器文档。所需要的只是argcargv,以及argv 数组指向的字符串,可由程序修改。

我尝试执行free(argv),但出现分段错误。为什么会这样?

您没有将argv 分配给malloc。您不需要释放命令行参数向量。

【讨论】:

以上是关于操作系统在哪里存储命令行参数?的主要内容,如果未能解决你的问题,请参考以下文章

main() 如何接收命令行参数?

C++ 如何将命令行参数转换为数组?

在哪个内存段中存储命令行参数? [复制]

无法弄清楚如何正确存储命令行参数[关闭]

Go语言命令行参数

Go语言命令行参数