整个程序执行真的存在静态变量吗? 我知道这个代码片段没有任何意义,但我问自己,因为我理解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()之前它也是有效的?
答案 0 :(得分:1)
我对你的要求感到困惑。
static int * siPtr;
return siPtr;
这意味着,由于siPtr
为static
,因此它已初始化为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
是静态的无关。