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