一般来说,你不能做你想做的事,正如Felix Palmen 的回答中所解释的那样。
我应该得到一个警告或错误,说明在我的应用程序中我无法将地址值分配给整数。
静态且可靠地检测所有指针故障是不可能的(因为可以证明它等同于解决停机问题)。顺便说一句,您可能会考虑使用Frama-C等静态程序分析工具。
在 Linux 上,原则上,您可以在运行时测试给定地址在您的虚拟地址空间中是否有效,例如使用/proc/
,例如通过解析/proc/self/maps
伪文本文件(理解我的意思cat /proc/$$/maps
,然后在终端中尝试cat /proc/self/maps
)。请参阅proc(5)。在实践中我不建议经常这样做(它可能太慢),当然它不是编译器的内置函数(你应该自己编码)。顺便说一句,请注意ASLR。
但是,有一些工具可以帮助检测(某些)错误地址使用,特别是valgrind和地址清理工具,阅读有关GCC 的检测选项并尝试编译-fsanitize=address
...
不要忘记使用所有警告和调试信息来编译您的代码,因此请使用gcc -Wall -Wextra -g
它来编译它。
顺便说一句,如果您将某个局部变量的地址存储在某个全局指针中,并在该局部变量在范围内之后取消引用该指针,您仍然会有一些未定义的行为(即使您的代码没有崩溃,因为您通常会取消引用一些随机地址在你的调用堆栈上),你应该很害怕。应始终避免 UB。