在if条件内定义变量,程序不输入

问题描述 投票:0回答:1

在 C 语言的函数中,我知道堆栈通常用于存储传递给函数的参数以及函数的局部变量。我知道这是编译器和平台相关的,因为也可以使用寄存器,但我们假设在这种情况下仅使用堆栈。

无论局部变量在函数内的何处定义,通常都会在堆栈上为局部变量保留空间吗?

例如,如果我们在函数中有一个 if 条件,当它为 true 时,变量将在 if 块内定义。是否只有在进入区块时才调用push()操作,而在离开区块时才调用pop()操作?

或者无论 if 条件是否成立,堆栈上都会为这些变量保留空间?

c function if-statement stack local-variables
1个回答
0
投票

嗯,这完全是实现定义的。让我们忽略任何有关优化的内容,并根据标准 C 来解释这个问题。

首先,C 标准没有指定任何有关内存布局的内容。因此,实现(即,编译器)可以选择任何方式为对象(即,变量)分配内存空间,只要它们遵守生命周期约束。

对象的生命周期是程序执行的一部分,在此期间保证为其保留存储空间。

if
语句中定义的对象(不带
static
thread_local
说明符)具有“自动存储持续时间”,其生命周期从进入块开始到离开块结束。

因此,“自动存储时长对象的内存空间是提前分配还是及时分配”的答案完全取决于实现。

在实践中,“局部变量”通常会提前分配(即使在古老的

x86
ISA中,例如8086)。但对于VLA来说,它们只能及时分配。如果您确实想了解特定实现下的行为,只需参考其文档(例如 GCC 的用户手册内部文档)。

© www.soinside.com 2019 - 2024. All rights reserved.