问题描述
是的,我很清楚你不应该那样做。如果我们有这个代码:
int *foo() {
int a = 42;
return &a;
}
正如大多数 C 程序员所知,这是未定义的行为:Using pointer after free()
int *p = foo();
printf("%d\n",*p);
只是为了让未来的读者不要把这当成事实。下面的所有内容,直到问题都是基于我的错误假设。这不是UB。简直糟透了。
正如一些 C 编码人员所知道的,但比上面的要少,这也是 UB,即使没有取消引用:(试图找到一个关于这个的好问题,但没有找到任何人)
int *p = foo();
printf("%p\n",p); // Should be printf("%p\n",(void*) p);
// Eric P clarified this in his answer,but this missing cast
// is not a part of the primary question
出于同样的原因,这也是 UB,因为发生的情况是指针变得不确定,就像未初始化的变量一样。所谓的悬空指针。
int *p = foo();
int *q = p;
有些人有些惊讶,即使这样也不行:
free(ptr);
if(ptr == NULL) // Just as bad as if ptr is not initialized
问题
我确实想知道,这一行是否也调用了 UB:
int *p = foo();
或者甚至这个?
foo();
换句话说,p
会成为一个悬空指针,还是被赋值给一个悬空指针?
我不知道这是否有任何实际用途,除了对 C 语言有更深入的了解。一个很好的用例是找出哪些重构是紧急的,哪些可以等待。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)