Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 堆栈内存是在运行时还是编译时分配的?_C_Stack Memory - Fatal编程技术网

C 堆栈内存是在运行时还是编译时分配的?

C 堆栈内存是在运行时还是编译时分配的?,c,stack-memory,C,Stack Memory,堆栈是在运行时还是编译时分配的? 例如: 堆栈总是在运行时分配的,您需要堆栈来执行方法,而不是编译 当然,堆栈是在运行时分配的。执行code.ec需要堆栈内存 检查此选项,它讨论了C程序的内存布局。堆栈是在运行时分配的;但是,每个堆栈帧的布局是在编译时决定的,可变大小数组除外。如何分配编译时?如果我在我的机器上编译代码,但在你的机器上执行它,编译器如何能够为你的机器上的堆栈预先分配内存?应该会有所帮助。堆栈内存在运行时分配 请记住,它必须在运行时分配,因为编译器无法知道函数被调用了多少次,whi

堆栈是在运行时还是编译时分配的?
例如:


堆栈总是在运行时分配的,您需要堆栈来执行方法,而不是编译


当然,堆栈是在运行时分配的。执行code.ec需要堆栈内存


检查此选项,它讨论了C程序的内存布局。

堆栈是在运行时分配的;但是,每个堆栈帧的布局是在编译时决定的,可变大小数组除外。

如何分配编译时?如果我在我的机器上编译代码,但在你的机器上执行它,编译器如何能够为你的机器上的堆栈预先分配内存?

应该会有所帮助。堆栈内存在运行时分配


请记住,它必须在运行时分配,因为编译器无法知道函数被调用了多少次,while循环被执行了多少次,等等。

它必须在运行时分配。考虑以下事项:

void a( void )
{
    int x;
}

void b( void )
{
    int y;
    a();
}

int main( void )
{
    a();
    b();
}

a()中堆栈本地x的地址在两次调用之间将不同。正如blinkenlights指出的,每个函数堆栈帧的布局在很大程度上是在编译时确定的,但该帧的位置是在运行时确定的。

为了补充所有其他答案(在一般情况下是正确的),理论上,有时可以在编译时分配堆栈(取决于您对“分配”的定义)


具体地说,如果您的程序没有函数指针或递归,那么可以使用静态分析来计算所需的最大堆栈大小。事实上,一些嵌入式编译器正是这样做的。

查看这篇伟大的文章

这是一篇关于程序内存的精彩文章。 您还可以查看同一作者关于s系统中内存行为的其他文章,这将使您深入了解内存中的实际工作情况

如果你想知道关于记忆的一切,试着读一下乌尔里希·德雷珀的这篇文章


希望这有帮助!

你的目标平台是什么?递归的存在告诉我必须在运行时分配堆栈。@user957902,目标平台在这里有什么关系?一些C的实现,例如用于低端Pic微控制器的C,没有堆栈。C是高级语言,编译成什么很重要。这就是依赖于平台。经验法则:所有内存分配始终在运行时完成。原因——在编译代码时,它将运行的机器可能还没有构造好。编译器如何在不存在的机器上分配内存?例如,一些反例可能比运行时早一点mple也许可以“分配”内存在将映像写入设备时。除了布局之外,在程序运行之前确定的是堆栈基址。它可以是在某些嵌入式或低级应用程序的编译时确定的,也可以是在将控制权传输到CRT时由操作系统生成的地址。仅用于文档,是解释“stac”的链接k框架术语……我想这取决于你对“分配”的定义。当然可以对程序进行硬编码,以使用虚拟地址空间的特定区域,例如。@OliCharlesworth,您如何让编译器确保该区域实际适合内存?我曾在一个MCU上工作过,该MCU的内存是以字节计的,我在工作的机器中有多位数Gb。som在这些机器上安装的东西在提到的MCU上会有很多机会,它需要确保安装吗?在运行时分配中,它通常也不能确保有足够的内存,如果堆栈的内存不足,程序就会惊人地崩溃。又名。堆栈溢出。@RuneFS:我不是说它总是有但是,这是不可能的。
void a( void )
{
    int x;
}

void b( void )
{
    int y;
    a();
}

int main( void )
{
    a();
    b();
}