Ste*_*eve 2 c variables parameters pointers local
我在学习指南中发现了这个问题,我不确定为什么返回指向局部变量/参数的指针会很糟糕.有任何想法吗?
这不是一个"坏习惯"(暗示它可能会导致问题),而是一种绝对会导致未定义行为的做法.这就像解除引用空指针一样:不要这样做,并期望程序在逻辑限制范围内运行.
说明:
当声明局部变量(包括参数)时,它被赋予自动存储,这意味着编译器负责为变量分配内存,然后在程序员的帮助下解除分配该内存.
void foo(int bar)
{
int baz;
} //baz and bar dissappear here
Run Code Online (Sandbox Code Playgroud)
当变量'lifetime终止时(例如函数返回时),编译器履行其承诺,并且销毁函数本地的所有自动变量.这意味着任何指向这些变量的指针现在指向程序认为"免费"执行任何操作的垃圾内存.
返回值时,这不是问题:程序找到一个新位置来放置值.
int foo(int bar)
{
int baz = 6;
return baz + bar; //baz + bar copied to new memory location outside of foo
} //baz and bar disapear
Run Code Online (Sandbox Code Playgroud)
返回指针时,指针的值将照常复制.但是,指针仍指向同一位置,现在是垃圾:
int* foo(int bar)
{
int baz = 6;
baz += bar;
return &baz; //(&baz) copied to new memory location outside of foo
} //baz and bar disapear! &baz is now garbage memory!
Run Code Online (Sandbox Code Playgroud)
访问此内存是不明确的行为,因此您的程序几乎肯定会以某种方式行为不端.例如,我曾经成为这个确切问题的受害者,虽然我的程序没有崩溃或终止,但是当编译器覆盖"免费"内存时,我的变量开始降级为垃圾值.