【发布时间】:2019-12-17 19:23:16
【问题描述】:
一方面,如果我编写以下代码:
int* fortytwo_pointer () {
int v = 42;
return &v;
}
我得到一个悬空指针,我可以通过调用来检查它
printf ("forty two : %d\n", *(fortytwo_pointer()));
另一方面
int* copy (int *pointer) {
return pointer;
}
int* fortytwo_pointer () {
int v = 42;
return copy (&v);
}
不会产生相同的“分段错误”错误。
我希望它也是一个悬空指针的实例,因为值 v 一样超出范围。是真的吗?如果是这样,如何检查指针是否确实悬空?
编辑: This question 更专注于动态检查指针是否有效,例如,如果我们从调用库函数中获取指针。我更感兴趣的是检查代码是否会产生无效指针。
【问题讨论】:
-
错误仅在您的编译器/调试器中吗?因为在第一种情况下它会注意到,但在第二种情况下,编译器/调试器不知道您正在返回悬空指针。
-
解除对悬空指针的引用可能“有效”(用引号括起来),但不能保证。这是未定义的行为,您不应依赖它。
-
"可以通过调用 printf 来检查这个"。不,你不能。不能保证会出现故障,实际上在许多情况下可能不会。这就是 C 中所谓的“未定义行为”。不幸的是,该语言没有任何简单的方法可以在访问指针之前检查指针是否有效。有一些特定于平台的方法。但总的来说,C 程序员需要依靠开发最佳实践,如代码审查、测试和调试来根除此类内存问题。还有valgrind等工具可以提供帮助。
-
...我可以通过调用
printf ("forty two : %d\n", *(fortytwo_pointer()));来检查这一点 不是真的。这是未定义的行为。 另一方面...不会产生相同的“分段错误”错误。因为它是未定义的行为。 -
这能回答你的问题吗? Testing pointers for validity (C/C++)
标签: c dangling-pointer