gpt4 book ai didi

c - 静态的生命周期真的在程序执行时开始吗?

转载 作者:行者123 更新时间:2023-11-30 21:04:02 24 4
gpt4 key购买 nike

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

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

An object whose identifier is declared with external or internal linkage, or with the storage-class specifier static has static storage duration. Its lifetime is the entire execution of the program and its stored value is initialized only once, prior to program startup.

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

最佳答案

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

static int * siPtr;
return siPtr;

这意味着由于 siPtr静态,因此它被初始化为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 是静态的无关。

关于c - 静态的生命周期真的在程序执行时开始吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18377663/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com