我必须实现一个在执行时可以处理主内存的算法,我想知道这样声明的变量会发生什么(我指的是int i):
int i
for(int i=0; i<100; i++){ ..... }
在for语句的末尾,它是保留在内存中还是以某种方式“释放”?
wlwcrazw1#
对于在for语句中声明的变量,其生存期在for语句执行结束时结束。* 生存期 * 是程序执行的一部分,在此期间,将为C计算模型中的对象保留内存。在实现该模型时,编译器理论上可以为堆栈上显示的i分配空间(通过调整栈顶指针),并可在语句结束时通过反向调整释放该空间。实际上,大多数普通编译器计划整个函数的执行,并在函数启动时建立一个堆栈帧,而在函数end(有一些例外,比如变长数组)。在函数中,根据编译器的设计,堆栈帧的内存被共享用于不同的用途。这意味着,当for循环结束时,可能不会立即调整堆栈指针。然而,i变量的内存可能会或不会立即被重用于其他用途,这取决于函数正在进行的其他计算以及编译器的安排。这是假设i使用了内存,而变量在C标准使用的计算模型中使用内存,编译器被允许生成任何获得相同可观察行为的代码。(对于简单程序,可观察到的行为主要是程序的输入和输出。)编译器可以使用用于i的处理器寄存器,并且从不将其值保存在存储器中。循环执行结束后,处理器可以立即将该寄存器重新用于其他目的。
for
i
n6lpvg4x2#
这取决于定义变量的位置。如果你在循环之前定义它,并且在循环中初始化它--它将在循环之后继续存在,保留上次循环修改过的值。
int i;//define variable here for (i = 0; i < 10; i++) { //some code inside the loop } printf("Value of i is: %i", i);//print variable here
输出将为:
Value of i is: 10
在另一种情况下,你可以在循环中定义和初始化变量(就像你在例子中所做的那样)。在这种情况下,变量会在程序离开循环后被删除,因为它离开了一个局部作用域。你可以尝试在循环后将它传递给一个函数,但你会收到编译错误。
2条答案
按热度按时间wlwcrazw1#
对于在
for
语句中声明的变量,其生存期在for
语句执行结束时结束。* 生存期 * 是程序执行的一部分,在此期间,将为C计算模型中的对象保留内存。在实现该模型时,编译器理论上可以为堆栈上显示的
i
分配空间(通过调整栈顶指针),并可在语句结束时通过反向调整释放该空间。实际上,大多数普通编译器计划整个函数的执行,并在函数启动时建立一个堆栈帧,而在函数end(有一些例外,比如变长数组)。在函数中,根据编译器的设计,堆栈帧的内存被共享用于不同的用途。这意味着,当
for
循环结束时,可能不会立即调整堆栈指针。然而,i
变量的内存可能会或不会立即被重用于其他用途,这取决于函数正在进行的其他计算以及编译器的安排。这是假设
i
使用了内存,而变量在C标准使用的计算模型中使用内存,编译器被允许生成任何获得相同可观察行为的代码。(对于简单程序,可观察到的行为主要是程序的输入和输出。)编译器可以使用用于i
的处理器寄存器,并且从不将其值保存在存储器中。循环执行结束后,处理器可以立即将该寄存器重新用于其他目的。n6lpvg4x2#
这取决于定义变量的位置。
如果你在循环之前定义它,并且在循环中初始化它--它将在循环之后继续存在,保留上次循环修改过的值。
输出将为:
在另一种情况下,你可以在循环中定义和初始化变量(就像你在例子中所做的那样)。在这种情况下,变量会在程序离开循环后被删除,因为它离开了一个局部作用域。你可以尝试在循环后将它传递给一个函数,但你会收到编译错误。