- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
据我所知,变量“q”和地址在函数 fun() 结束后超出范围。那么,为什么代码的输出是“20 10”?
int *p2;
void fun(int *ptr)
{
int q=10;
ptr=&q;
p2 = ptr;
}
int main()
{
int r=20;
int *p = &r;
fun(p);
printf("%d %d",*p,*p2);
return 0;
}
最佳答案
正如其他人提到的,保存局部变量的地址然后在函数返回后尝试取消引用该地址是 undefined behavior .
这意味着您的程序可能会崩溃,可能会表现出奇怪的行为,或者看起来可以正常工作。对于相同的代码或存在看似无关的更改,此行为不需要从一个编译器到下一个编译器保持一致。
也就是说,许多编译器通常不会在函数返回后修改函数使用的堆栈部分。这是通常不需要的额外工作。所以在 fun
返回后,它所拥有的局部变量仍然包含它们的旧值。
在调用 printf 时,指针 p2
在调用 printf 之前被取消引用。由于在此之前没有调用其他函数,因此上次调用 fun
的 a 值尚未被覆盖。因此,您读取了旧值。
如果您在调用 printf
之前调用其他函数,之前由 q 占用的内存位置将被覆盖,因此您可能会看到其他一些值。
但是,重申一下,这是未定义的行为。并非所有编译器都需要以这种方式运行。例如,在高安全性环境中,编译器可能会在函数返回后清除堆栈内存,从而无法恢复该函数使用的敏感数据。
关于c - 为什么输出是 "20 10"而不是垃圾值(悬挂指针)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40347841/
我试图使用 2 个文件描述符让父级向子级发送信息,并让子级将其发回。 #include #include #include #define READ 0 #define WRITE 1 int
我需要摆脱警告,其中之一是 -Wdangling-else。它在以下宏定义中记录了一个悬空 if: #define FOR_EACH_REF(var, container) \ if(bool
我使用eclipse进行php开发。我最近遇到了一个问题,IDE 会挂起,并且每当我打开 eclipse 时就会立即返回挂起状态。它说它卡在“初始化Java工具”上。我重新安装了多个版本的java和e
我想使用队列来保存结果,因为我希望消费者(串行而不是并行)在工作人员产生结果时处理工作人员的结果。 现在,我想知道为什么以下程序挂起。 import multiprocessing as mp imp
我是 ruby/rails 的新手,过去 2 天一直被一个问题搞得头晕目眩,希望这个论坛上的人能帮助我解决这个问题。 我正在使用 Rails 4 并使用 Passenger + Nginx 和 M
在堆上释放内存后 - vector 中仍保留(悬空)指针。如何完全删除 vector 元素? vector obstacles; vector actions; void Game::free(Ga
在编译器构造中,主要的歧义问题之一是dangling else。正如 Aho、Lam、Sethi 和 Ullman 在《编译器:原理、技术和工具》一书中提到的,悬空 else 的语法不能与 LL(1)
细节: ? Workspace name (e.g., org name) swag
我是一名优秀的程序员,十分优秀!