例如,在Linux中,我有一个指向task_struct的指针。稍后,task_struct可能会迁移或删除。我如何知道指针是否仍然指向task_struct?
答案 0 :(得分:6)
这是不可能的。
指针只包含地址,通常无法确定给定地址是否“有效”。
有时你可以问给你指针的实体,如果它仍然有效,那当然取决于实体的确切细节。语言本身无法做到这一点。
答案 1 :(得分:5)
你不知道,因为:
所以,C没有提供处理这类问题的工具,你必须追踪你自己指出的东西。
您可以询问的最多(并且它是特定于操作系统的)是检查结构所在的内存页是否仍然可访问,但通常它不是一个特别有用的信息。
答案 2 :(得分:3)
根据您的分配模式/运气,您可能会遇到分段错误(当然会导致您的程序失效)......但至少会告诉您该引用不再有效。
但是,如前所述,最好的方法是自己跟踪有效性。
如果你需要继续在内存中移动一个struct(而不是只是消隐它并在当前位置重新初始化它),你可以考虑使用指向指针的指针来简化跟踪。
“即。Everything获取对结构的指针的引用,然后当您移动或删除结构时,您只需将该指针设置为NULL或新的内存位置。”
另外,一般来说,如果你想对你的程序进行这种奇怪的检查,我建议你查看valgrind。
答案 3 :(得分:1)
在C中,您有责任编写代码以便跟踪它。你可以使用NULL的特殊值(表示不指向任何东西),当你删除(或者还没有设置)它指向的任何东西时将指针设置为NULL。在使用之前测试NULL。您也可能以一种永远不会出现问题的方式设计代码。
无法查询随机指针值以查看它是否表示某些内容,就像无法查询int变量以检查其中的值是否未初始化,垃圾或正确的计算结果一样
这完全是软件设计的问题,必要时使用NULL值来指定未设置。