C 如何知道指针是否指向特定结构?

C 如何知道指针是否指向特定结构?,c,pointers,struct,C,Pointers,Struct,例如,在Linux中,我有一个指向任务结构的指针。稍后,任务结构可能会迁移或删除。我如何知道指针是否仍然指向任务结构?您不知道,因为: 指针只包含它指向的对象的地址 类型信息在编译时丢失 因此,C没有提供处理此类问题的工具,您必须自己跟踪所指向的内容发生了什么 你能问的最多的问题(通常是操作系统特有的)是检查结构所在的内存页是否仍然可以访问,但通常这不是一个特别有用的信息。这是不可能的 指针只包含地址,通常无法确定给定地址是否“有效” 有时,您可以询问给您指针的实体是否仍然有效,但这当然取决

例如,在Linux中,我有一个指向任务结构的指针。稍后,任务结构可能会迁移或删除。我如何知道指针是否仍然指向任务结构?

您不知道,因为:

  • 指针只包含它指向的对象的地址
  • 类型信息在编译时丢失
因此,C没有提供处理此类问题的工具,您必须自己跟踪所指向的内容发生了什么

你能问的最多的问题(通常是操作系统特有的)是检查结构所在的内存页是否仍然可以访问,但通常这不是一个特别有用的信息。

这是不可能的

指针只包含地址,通常无法确定给定地址是否“有效”


有时,您可以询问给您指针的实体是否仍然有效,但这当然取决于实体的确切细节。语言本身无法做到这一点。

在C语言中,编写代码以便跟踪代码是您的责任。您可以使用NULL的特殊值(表示不指向任何对象),在删除(或尚未设置)指针指向的对象时将指针设置为NULL,并在使用它之前测试NULL。您还可以以一种永远不会出现问题的方式设计代码

无法查询随机指针值以查看它是否表示某个内容,就像无法查询int变量以检查其中的值是否未初始化、垃圾或计算结果是否正确一样


这完全是软件设计的问题,必要时,使用NULL值指定not set。

根据您的分配模式/运气,您可能会遇到分段错误(这当然会导致程序死机)…但这至少会告诉您引用不再有效

然而,如前所述,最好的方法是自己跟踪有效性

如果你需要在内存中继续移动一个结构(而不是仅仅在它的当前位置上对它进行消隐并重新初始化它),你可以考虑使用一个指向指针的指针来使跟踪变得更容易。 例如,所有内容都会引用指向该结构的指针,然后当您移动或删除该结构时,只需将该指针设置为NULL或新的内存位置


另外,一般来说,如果您想检查您的程序是否存在这种奇怪的情况,我建议您查看valgrind。

请定义“迁移”。数据是动态分配的吗?顺便说一下,在C语言中,你应该自己跟踪这类事情。+1表示指针到指针的建议。在性能关键的代码中,它可能存在缓存问题,但在其他方面,它是解决混乱问题的一个相当优雅的解决方案。值得注意的是,指针数组的索引也会起到类似的作用。谢谢。因此,如果我不知道结构被移动或删除的位置,我如何知道前一个指针仍然有效或无效,而不会使程序崩溃?如果我在结构内创建一个名为flag的int成员,那么每次创建结构时,我都将其初始化为100。然后每次我想访问结构时,我就用指针检查它是否仍然是100?但是,如果是分段错误,我仍然需要一种方法来避免崩溃。我过去对我创建或管理的结构所做的是,将一个签名作为结构成员的一部分,该签名通常是一个无符号长集,使用十六进制数设置为特定的位模式。当我使用指向结构的指针并执行free或delete操作时,在执行此操作之前,我将清除签名,使其全部为零。然后,当通过指针访问结构时,我要做的一件事就是检查签名是否正确。但是,对于由其他人的代码创建和管理的结构,这将不起作用。@RichardChambers严格来说,这是无效的。在对所述指针调用
free()
后,无法取消引用用于指向
malloc()
返回的内存的指针。这样做会调用未定义的行为,这是一个严重的错误。@unwind,是的,我知道您不应该取消引用已释放的指针,但有时您可以在复杂的旧源代码中执行任何操作。通过将该区域初始化为一个坏的签名,您可能会得到一个可识别的错误,而不是完全陷入杂草中。