gpt4 book ai didi

c - 为什么返回指向局部变量或参数的指针是不好的做法?

转载 作者:行者123 更新时间:2023-12-02 05:37:08 29 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How to access a local variable from a different function using pointers?

(10 个回答)


8 年前关闭。




我在我的学习指南上发现了这个问题,我不确定为什么返回指向局部变量/参数的指针会很糟糕。有任何想法吗?

最佳答案

这与其说是一种“不好的做法”(暗示它可能会导致问题),不如说它是一种会 的做法。绝对导致未定义的行为 .这就像取消引用一个空指针:不要这样做,并期望您的程序在逻辑范围内运行。

解释:

当声明一个局部变量(包括一个参数)时,它被自动存储,这意味着编译器负责为变量分配内存,然后释放该内存,而无需程序员的任何努力。

void foo(int bar)
{
int baz;
} //baz and bar dissappear here

当变量的生命周期结束时(例如函数返回时),编译器会履行其 promise ,并且函数本地的所有自动变量都会被销毁。这意味着任何指向这些变量的指针现在都指向程序认为“空闲”的垃圾内存,可以做任何它想做的事情。

返回值时,这不是问题:程序会找到一个新位置来放置值。
int foo(int bar)
{
int baz = 6;
return baz + bar; //baz + bar copied to new memory location outside of foo
} //baz and bar disapear

当你返回一个指针时,指针的值被照常复制。但是,指针仍然指向现在是垃圾的相同位置:
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!

访问此内存是未定义的行为,因此您的程序几乎肯定会以某种方式出现错误行为。比如我曾经 fell victim to this exact problem ,虽然我的程序没有崩溃或终止,但随着编译器覆盖“空闲”内存,我的变量开始降级为垃圾值。

关于c - 为什么返回指向局部变量或参数的指针是不好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20063617/

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