【问题标题】:Command line argument as size of an array: Compile time or run time?作为数组大小的命令行参数:编译时间还是运行时间?
【发布时间】:2016-02-20 02:50:43
【问题描述】:

所以我在这里提出了一个关于堆栈空间的非常基本的问题。我读过堆栈中的变量必须在编译时知道,但我不确定这有多准确。让我们来看看这个sn-p:

int main(int argc, char*argv[])
{
int numProcesses = argv[1];
int arr[numProcesses] = {};
...
}

当然,编译器在编译时无法知道 numProcesses 的值,以及 arr[] 的大小。那么 arr[numProcesses] 是如何、何时何地分配的呢?谢谢你的回答,我相信这会是一个有见地的答案。

【问题讨论】:

  • GCC 有一个扩展,允许在堆栈上分配可变长度数组。 C99 使其成为 C 的官方特性。
  • 一个堆栈,在运行时。假装编译器为您调用alloca。 (虽然alloca是一个非标准函数)
  • 不确定反对票是关于什么的......

标签: c stack command-line-arguments compile-time


【解决方案1】:

首先我会回答何时以及如何以及在哪里。

argc 将在编译时完成,因为它知道它是什么。编译器将为此分配内存作为普通变量。 argv 是动态部分,这将是运行时。编译器会再次为您分配内存,据我所知,也会将其删除。

既然知道 case argc 所需的内存量,它将在堆栈上,因为它的大小在编译时是已知的。 argv 将在堆上,因为它是在运行时动态分配的,因为它的长度事先不知道。

希望这会有所帮助!

【讨论】:

  • 什么时候删除这个内存?一旦程序执行结束?
  • 当堆栈的其余部分被释放时,它将删除 argc,据我所知。 argv 将完全由您的编译器确定。一般来说,如果你的编译器很聪明,它会在你不再使用它之后释放内存。它可能只是在最后删除它,尽管一旦它被释放,在大多数情况下它并不重要。
猜你喜欢
  • 1970-01-01
  • 2013-11-06
  • 2020-03-19
  • 2010-12-29
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
相关资源
最近更新 更多