我有这个程序:
int* b;
{
int a = 5;
b = &a;
} //a gets destroyed here
{
int c = 7; //c replaces a?
printf("c: %d\n", c);
}
printf("*b: %d", *b); //*b is still 5
为什么c不替换* b或类似的东西?是因为某些编译器优化(我正在使用clang进行编译,但是我已经尝试使用一些在线编译器,结果仍然相同)
答案 0 :(得分:3)
程序具有未定义的行为,因为指针p在此语句的范围内具有无效值
printf("*b: %d", *b);
,并且尝试取消引用它。
该指针具有无效(不确定)值,因为它没有指向对象。指针早期指向的对象在此范围内不存在。
根据C标准(6.2.4对象的存储时间)
- ...如果在生命周期之外引用对象,则行为为 未定义。指针的值不确定 当它指向(或刚刚过去)的对象到达其末端时 一生。