操作系统在哪里存储命令行参数?
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。命令行参数存储在内存的哪个部分(堆栈或堆)?
这取决于实施;检查您的编译器文档。所需要的只是argc
和argv
,以及argv
数组指向的字符串,可由程序修改。
我尝试执行free(argv)
,但出现分段错误。为什么会这样?
您没有将argv
分配给malloc
。您不需要释放命令行参数向量。
【讨论】:
以上是关于操作系统在哪里存储命令行参数?的主要内容,如果未能解决你的问题,请参考以下文章