我发现此代码on web为例,但我认为这不正确。返回自动变量的地址,这有点巧合,有时可能会起作用:
返回指向已销毁的局部变量的指针,该变量将成为无效的内存位置,未定义的行为。
我唯一的犹豫是关于指针是static
,但我认为这没有任何改变,因为这是应该是static
而不是指针的变量:局部变量将被销毁。你能否确认或否认?
double *& showNumber()
{
double n = 1550.85;
static double *v = &n;
return v;
}
int main(int argc, char *argv[])
{
double sn = *showNumber();
sn = *showNumber();
//...
}
答案 0 :(得分:2)
为了明确定义此代码,n
和v
都需要static
。
目前,*showNumber()
已undefined behaviour取消引用dangling pointer。
答案 1 :(得分:2)
您的代码仍有未定义的行为,因为退出函数后静态指针的值无效。指针引用的局部变量将被销毁。并且下次调用该函数时,该局部变量的地址可能不同。
你可以按照以下方式编写你的功能
double * showNumber()
{
static double n = 1550.85;
return &n;
}
在这种情况下,返回的指针将包含相同的有效值。
答案 2 :(得分:1)
一旦初始化,静态变量就会在程序的整个持续时间内持续存在。您已完成v
的设置,但<{1}}的地址 。
答案 3 :(得分:0)
如果指针及其变量都是静态的,那么只有代码才行。否则,局部变量无论如何都会死亡。
答案 4 :(得分:0)
独立于本地或全局,静态变量将一直持续到程序结束。 但是当我们返回该变量的值时,重新开始使用全局。因为静态本地可能会因线程而受到影响。