关于C语言中auto var的一个问题,当我学习协程并实现静态var时

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

现在,我正在学习如何实现 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 但实际上它也输出 enter image description here

我只能猜测,当程序再次调用

function
时,声明的变量地址将与之前声明的变量地址相同。我想知道这种情况靠谱吗?

c
1个回答
0
投票

使用

int i;
作为自动存储的代码在您第二次调用该函数时会调用未定义的行为,因为
i
的初始化代码在
state
设置为 1 时并未执行。您跳过了
 i = 0

访问未在任何地方获取其地址的未初始化自动变量是未定义行为,请参阅(为什么)使用未初始化变量未定义行为?

一般来说,

goto
跳过局部变量的声明/初始化是非常糟糕的做法,并且经常会调用未定义的行为。

此外,当

static int i
且您调用该函数时,带有
i==10
的示例也会调用未定义的行为。
for
循环将中断,此时函数末尾缺少 return 语句。

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