c++ - 悬空指针:对局部变量的引用不会破坏
问题描述
在阅读有关悬空指针的信息时,我遇到了一些悬空指针的示例和概念。基本上,悬空指针是那些曾经指向某个有效内存地址但该内存地址不再有效的指针(局部变量,释放内存)。
所以我尝试了这个例子:
int* fun(){
int a=100;
return a&;
}
int main() {
int *a =fun();
printf("fun %d",*a);
}
这给出了错误:返回局部变量的地址并且它与悬空指针概念同步。但我将这段代码稍微修改为:
int* fun(){
int a=100;
int* var=&a;
return var;
}
int main() {
int *a =fun();
printf("fun %d",*a);
}
这个工作没有任何错误。
我的疑问是,fun()
返回一个 int 指针,这个指针包含局部变量的地址a
。函数返回后a
应该释放内存,那么为什么这段代码可以正常工作而没有任何错误。
同样在我的系统上,以下内容不起作用:
int main() {
int* x;
{
int y = 3;
x = &y;
}
*x = 56;
printf("jsdf");
}
这是演示悬空指针的标准示例。
任何人都请让我知道我的想法在哪里出错以及幕后发生的事情。
PS:我正在使用 windows10,MinGW 编译器和 VSCode。
解决方案
前两个示例是等价的,并且在所有示例中都使用了悬空指针。编译器不会在第二个示例中向您显示错误,因为它不需要这样做,但它仍然是无效的,它的行为是未定义的。而 undefined 意味着undefined,即允许任何事情,包括看似有效的行为,但更可能是数据损坏、崩溃或其他任何事情(又名鼻恶魔)。
推荐阅读
- kubernetes - 为什么我不能用 Istio Gateway 暴露来自 istio 的 grafana?
- c# - 使用 AddWithValue 方法添加新的 where 子句
- java - 运行时生成节点的 JTree
- c++ - Armadillo (C++) 中的快速数组置换(广义张量转置)
- php - 多个 whereHas 上的 whereHas
- javascript - 重置 JavaScript 间隔而不是清除它
- mongodb - 根据提供的键修改嵌套的 dict 字段
- assembly - OpCodes 和 Data 之间的处理器有何不同?
- javascript - 排列数组的元素
- reactjs - babel-plugin-syntax-dynamic-import 不会转译