car*_*995 0 c variables pointers memory-address
下面是代码
代码:
#include <stdio.h>
int * num(void);
int main(void)
{
int * num2;
num2 =num();
printf("%d\n" , *num2);
return 0;
}
int * num(void)
{
int num = 20;
return #
}
Run Code Online (Sandbox Code Playgroud)
问题:
我们知道,函数num是函数的本地函数num(),所以在这段代码中我尝试num将函数中变量的地址返回给调用它的函数,即main().
之后我只使用解除引用运算符来提取特定num变量的值并将其打印出来main().
有一点我很困惑.我记得我读过一本关于javascript的书,提到变量生命周期在函数内,这意味着在函数完成执行其指令并将控制权传递给调用它的函数之后,函数中每个变量的值将是干净的out(垃圾收集器).但为什么在这段代码中我的main()函数仍然可以指向特定内存地址的值?
您可以看到变量值的原因是因为堆栈的工作原理.在您输入函数时num,有效地移动指针(堆栈指针)以为函数的本地存储添加空间.退出函数时,堆栈指针有效地向后移动,这意味着下一个函数调用将覆盖前一个函数调用中使用的堆栈存储.然而,在被覆盖之前,价值存在于一种不确定的状态.它实际上仍然在内存中,但可能随时被覆盖.那里存在的实际价值可能是也可能不是.这就是为什么像上面那样做被称为未定义的行为.
基本上......不要这样做.
| 归档时间: |
|
| 查看次数: |
203 次 |
| 最近记录: |