-3

整个程序执行过程中是否真的存在静态变量?我知道这个代码片段没有任何意义,但我问自己,因为我理解 c99 标准,当我进入 If 语句的范围时,这意味着我从未在对象的生命周期中取消引用. 因为幸运的是我取消了静态对象所在的地址。那么,就 if 语句为真而言,这不是一个未定义的行为吗?还是静态对象的生命周期只是从它的第一次出现开始?

#define UTHOPICALMATCH (int *) 0xBCAA1400
int *foo (void);

int main(int argc, char** argv)
{
    int * iPtr =  UTHOPICALMATCH;
    *iPtr = 5;

    if (foo() == UTHOPICALMATCH)
    {
        printf ("It's still defined behavior!!!\r\n"); // is this true?
        /*...*/
        return 0;
    }
    return -1;
}

int *foo (void)
{
    static int si;
    return &si;
}

编辑:在 6.2.4->3 的 c99 中,它说:

使用外部或内部链接或存储类说明符 static 声明其标识符的对象具有静态存储持续时间。它的生命周期是程序的整个执行过程,它的存储值只在程序启动之前初始化一次。

所以我不是在问,它在调用 foo() 之后的生命周期,我问我自己,这是否意味着它甚至在调用 foo() 之前就有效?

4

1 回答 1

1

我真的很困惑你在问什么。

static int * siPtr;
return siPtr;

这意味着因为siPtris static,它被初始化为NULL。而且因为您从不修改它,所以它会NULL在程序的整个生命周期中保留。(是的,即使foo()返回后它也确实存在。

int * iPtr =  UTHOPICALMATCH;
*iPtr = 5;

我看不出你在这里想做什么。UTHOPICALMATCH似乎是一个随机的硬编码地址,你确定它是有效的吗?

if (foo() == UTHOPICALMATCH)
    printf ("It's still defined behavior!!!\r\n"); // is this true?

只有 ifUTHOPICALMATCH是一个有效的指针,因为那时你只是比较两个指针是否相等。否则行为是未定义的,但这一事实与静态无关。siPtr

于 2013-08-22T10:22:20.210 回答