【问题标题】:How to check value of a pointer in C如何在C中检查指针的值
【发布时间】:2021-03-17 10:41:24
【问题描述】:

我正在编写一个程序,其中指向我正在使用的STR 类型结构的指针STR *pt(基本上是我想要使用动态内存的STR 结构数组)可能采用NULL 值因为有时我不想通过它存储任何数组,所以当我在该指针上使用free(pt) 时,我会遇到分段错误。我想要检查指针是否具有NULL 值,但是当我检查if(pt != NULL) free(pt); 时(我只想在指针不是NULL 时释放内存),条件始终为真,试图释放指针并发生分段错误。

有什么办法可以解决这个问题吗? 比较指针值的另一种方法?

【问题讨论】:

  • 你提到的free(NULL)不会导致故障,它是由于试图free一个指针,其值不是从malloc等获得的。欢迎使用StackOverflow!请张贴Minimal Reproducible Example,这是显示问题的最短完整代码。
  • 您是否碰巧在使用 1990 年代的工具链?
  • 您的问题不是因为pt 为NULL,而是它无效(例如,堆损坏,您修改了 *alloc 返回的原始指针等)。

标签: c pointers null segmentation-fault free


【解决方案1】:

您的支票看起来正确;如果将非空指针传递给堆分配的结构,free() 应该不会失败。

'pt' 的值从何而来?你是从 malloc() 得到的吗?

如果您还没有,那么可能值得使用 GDB 来验证此处的 NULL 指针是否确实导致了您的问题。

【讨论】:

  • free(NULL) 完全合法且无害,因此测试无用。
  • 哈;我从来不知道,但你是对的。为了迂腐,我遇到了这个stackoverflow.com/a/46825852/6791142。所以我想不应该依赖 if(pt)。
  • STR *pt 的值来自内存分配在以前发生的情况下,在相反的情况下我认为NULL 本来是存储。有什么方法可以检查是否产生了内存分配?
  • 您可能对Is NULL always false?感兴趣
【解决方案2】:

你只能在 malloc、calloc 或 realloc 分配的内存上使用 free()。首先你必须为其分配一些内存然后检查

if(pt)
{
    free(pt)
}

【讨论】:

  • 不,你不必检查指针是否不是NULL
  • @WeatherVane:我问了 OP 一个问题;如果他回答是...
  • (我只想在指针不为 NULL 时释放内存)根据用户 JuanSarraceno
  • free(NULL) 完全合法且无害,因此测试无用。
  • 是的,测试没用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
  • 2016-05-25
  • 1970-01-01
  • 2015-12-29
  • 2012-01-08
  • 1970-01-01
相关资源
最近更新 更多