现在,我正在学习如何实现 static var 的协程,我找到了它的部分代码。
原代码:
int function(void) {
static int i, state = 0;
switch (state) {
case 0: goto LABEL0;
case 1: goto LABEL1;
}
LABEL0:
for (i = 0; i < 10; i++) {
state = 1;
return i;
LABEL1:;
}
}
这段代码让不同调用中的
i
呈现0,1,2,3,4,...,9,但是一旦我将static i
更改为自动变量,它的单词与以前相同:
int function(void) {
static int state = 0;
int i;
switch (state) {
case 0: goto LABEL0;
case 1: goto LABEL1;
}
LABEL0: // 函数开始执行
for (i = 0; i < 10; i++) {
state = 1;
return i;
LABEL1:;
}
}
它应该输出 0,0,0,0 但实际上它也输出
我只能猜测,当程序再次调用
function
时,声明的变量地址将与之前声明的变量地址相同。我想知道这种情况靠谱吗?
使用
int i;
作为自动存储的代码在您第二次调用该函数时会调用未定义的行为,因为 i
的初始化代码在 state
设置为 1 时并未执行。您跳过了 i = 0
。
访问未在任何地方获取其地址的未初始化自动变量是未定义行为,请参阅(为什么)使用未初始化变量未定义行为?
一般来说,
goto
跳过局部变量的声明/初始化是非常糟糕的做法,并且经常会调用未定义的行为。
此外,当
static int i
且您调用该函数时,带有 i==10
的示例也会调用未定义的行为。 for
循环将中断,此时函数末尾缺少 return 语句。