我编写了一个返回数组的函数,虽然我知道我应该返回一个动态分配的指针,但我仍然想知道当我返回在函数内部本地声明的数组(不将其声明为静态)时会发生什么,当我注意到函数中内部数组的内存没有被释放时,我感到很惊讶,并且我将数组返回到主函数。
主要的:
int main()
{
int* arr_p;
arr_p = demo(10);
return 0;
}
和功能:
int* demo(int i)
{
int arr[10] = { 0 };
for (int i = 0; i < 10; i++)
{
arr[i] = i;
}
return arr;
}
当我取消引用时arr_p
我可以看到设置的0-9整数demo
功能。
两个问题:
- 怎么我检查的时候
arr_p
我看到它的地址与arr
这是在demo
功能?
- 怎么会
demo_p
指向已经在中的未释放的数据(0-9数字)demo
?我期望arr
inside demo
当我们退出时将被释放demo
scope.
编程时必须注意的事情之一是要充分注意规则的内容,而不仅仅是那些看起来有效的内容。规则规定您不应该返回指向本地分配数组的指针,这是一条真实的规则。
如果您在编写返回指向本地分配数组的指针的程序时没有收到错误,这并不意味着它没问题。 (尽管如此,这意味着您确实应该获得一个更新的编译器,因为任何像样的现代编译器will警告这一点。)
如果您编写一个返回指向本地分配数组的指针的程序并且它似乎可以工作,那么这也不意味着它没问题。对此要非常小心:一般来说,在编程中,尤其是在 C 中,似乎有效的是not证明你的程序没问题。你真正想要的是你的程序能够运行出于正确的理由.
假设你租了一套公寓。假设,当您的租约到期并且您搬出时,您的房东没有向您收取钥匙,但也没有换锁。假设几天后,您意识到自己把某样东西忘在了壁橱后面。假设你没有询问就偷偷溜回来尝试收集它。接下来发生什么?
- 碰巧的是,你的钥匙在锁里仍然可以使用。这是一个完全的惊喜,还是有点出乎意料,或者保证有效?
- 碰巧的是,你忘记的物品仍然存在is在衣柜里。目前尚未清除。这是一个完全的意外,还是有点出乎意料,或者肯定会发生?
- 最后,无论是你的旧房东还是警察,都没有因为你的非法侵入行为而向你招呼。再说一次,这完全是一个惊喜,还是有点出乎意料,还是完全在意料之中?
您需要知道的是,在 C 语言中,重用您不再被允许使用的内存与偷偷溜回您不再租用的公寓几乎完全相同。它可能有效,也可能无效。你的东西可能还在,也可能不在。你可能会遇到麻烦,也可能不会。无法预测将会发生什么,并且无论发生或未发生,都无法得出(有效)结论。
返回到您的程序:局部变量,例如arr
通常存储在调用堆栈上,这意味着即使在函数返回后它们仍然存在,并且可能不会被覆盖,直到调用下一个函数并将堆栈上的该区域用于其自己的目的(甚至可能不会被覆盖) )。因此,如果您返回一个指向本地分配内存的指针,并立即取消引用该指针(在调用任何其他函数之前),那么它至少有可能“工作”。这又类似于公寓的情况:如果还没有其他人搬进来,那么您忘记的物品很可能仍然在那里。但这显然不是你可以依赖的东西。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)