在程序执行中真正开始静态的生命周期?

时间:2013-08-22 10:16:26

标签: c static c99 undefined-behavior

整个程序执行真的存在静态变量吗?  我知道这个代码片段没有任何意义,但我问自己,因为我理解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.24-> 3的c99中,它说:

  

一个对象,其标识符使用外部或内部链接声明,或者使用   storage-class specifier static具有静态存储持续时间。它的一生就是整个   程序执行程序及其存储的值仅在程序之前初始化一次   启动。

所以我没有要求,它在调用foo()之后的生命时间,我问自己,这是否意味着即使在调用foo()之前它也是有效的?

1 个答案:

答案 0 :(得分:1)

我对你的要求感到困惑。

static int * siPtr;
return siPtr;

这意味着,由于siPtrstatic,因此它已初始化为NULL。而且因为你永远不会修改它,所以在程序的整个生命周期中它仍然是NULL。 (是的,即使在foo()返回后也确实存在。

int * iPtr =  UTHOPICALMATCH;
*iPtr = 5;

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

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

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