GOTO会在堆栈存储器中产生溢出吗? StackOverflow?

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

我不是C方面的专家,但我做得很好,我的主要工作是嵌入式系统和微控制器编程。

我知道避免使用GOTO指令是一个神话,因为它会创建意大利面条代码。作为一个微控制器程序员,我经常在小程序中使用汇编语言,而GOTO是唯一的选择,但是就像在C语言中一样(或与之不同?),在使用指令时必须要小心,因为如果您使用的是子例程,例如,您可能已经在堆栈存储器中使用了一个空间,因此可以返回到原始例程。

但是,如果您错误地使用GOTO指令从Soubroutine跳转到了主代码,则您没有释放堆栈内存,并且如果您多次调用该子例程,最终将导致溢出。

所以,我的问题是,当我们用C编写一个嵌套循环时,例如一堆FOR,然后使用goto指令从内部循环中中断,是否会引起与我之前描述的相同的问题?

c assembly stack-overflow microcontroller goto
1个回答
1
投票

goto不能在功能之间跳转,只能在同一功能内跳转。因此它不会添加到堆栈中,也不会丢失堆栈帧。

setjmp()longjmp()是一种更受约束的机制,它可以直接跳转到另一个功能。但是longjmp()仅可在调用具有相同setjmp()jmp_buf的函数的生命周期内使用,并且已指定将其展开到该函数的栈(语言规范实际上并不涉及栈,而是使用更通用的语言,但是在大多数实际实现中,它的作用相同。

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