作为数组大小的命令行参数:编译时间还是 运行 时间?
Command line argument as size of an array: Compile time or run time?
所以我在这里有一个关于堆栈的非常基本的问题 space。我读过必须在编译时知道堆栈中的变量,但我不确定这有多准确。让我们看一下这个片段:
int main(int argc, char*argv[])
{
int numProcesses = argv[1];
int arr[numProcesses] = {};
...
}
自然地,编译器在编译时无法知道 numProcesses 的值,以及 arr[] 的大小。那么 arr[numProcesses] 是如何、何时、何地分配的呢?感谢您的回答,我相信这会是一个有见地的答案。
首先我会回答何时何地然后在哪里。
argc 将在编译时完成,因为那时知道它是什么。编译器将为此分配内存作为普通变量。 argv 是动态部分,这将是 运行 时间。编译器将再次为您分配内存,据我所知,也会将其删除。
因为 case argc 所需的内存量是已知的,它将在堆栈上,因为它的大小在编译时是已知的。 argv 将在堆上,因为它是在 运行 时间动态分配的,因为它的长度事先未知。
希望对您有所帮助!
所以我在这里有一个关于堆栈的非常基本的问题 space。我读过必须在编译时知道堆栈中的变量,但我不确定这有多准确。让我们看一下这个片段:
int main(int argc, char*argv[])
{
int numProcesses = argv[1];
int arr[numProcesses] = {};
...
}
自然地,编译器在编译时无法知道 numProcesses 的值,以及 arr[] 的大小。那么 arr[numProcesses] 是如何、何时、何地分配的呢?感谢您的回答,我相信这会是一个有见地的答案。
首先我会回答何时何地然后在哪里。
argc 将在编译时完成,因为那时知道它是什么。编译器将为此分配内存作为普通变量。 argv 是动态部分,这将是 运行 时间。编译器将再次为您分配内存,据我所知,也会将其删除。
因为 case argc 所需的内存量是已知的,它将在堆栈上,因为它的大小在编译时是已知的。 argv 将在堆上,因为它是在 运行 时间动态分配的,因为它的长度事先未知。
希望对您有所帮助!