【问题标题】:how to check the value of pointer (void) not be zero (Attempt to dereference a generic pointer)如何检查指针(void)的值不为零(尝试取消引用通用指针)
【发布时间】:2013-02-21 12:10:13
【问题描述】:

对不起,这一定是一个非常简单的问题,但由于我尝试了不同的方式但没有成功,我必须在这里询问以确认。 C 编程:

有一个结构名称rtg。 编辑:mtch 的类型是 LLIST 初始类型是 LL_NODE obj 的 typr 是指针(void)

。 检查时使用 gdb

(gdb)  print *rtg->mtch->initial->obj
Attempt to dereference a generic pointer.


(gdb) print rtg->mtch->initial->obj

$10 = (void *) 0x4cc660
(gdb) x 0x4cc660
0x4cc660:       0x00000000

这个空指针会导致我的程序出现段错误。我正在寻找的只是如何检查 rtg->mtch->initial->obj 指向的值不为零? (以防止上述段错误)我的意思是如果我检查 if (rtg->mtch->initial->obj) ,它只会检查指针 obj ,地址是否不为零(这不是我想要的,我打算检查该指针的值不为零(但是当我在检查 gdb 之前使用 * 时,它会显示“尝试取消引用通用指针”。 那么检查该值不为零(并防止此段错误)的正确方法是什么?

编辑:我试过这个

if (*((char *) rtg->mtch->initial->obj) != NULL)

但我收到了编译警告:

警告:指针与整数的比较

EDIT2,源代码中定义的这些是什么

ECM_REQUEST 是结构体 ECM_REQUEST rtg; 在这个结构中定义 mtch 为 LLIST mtch;

初始是LL_NODE

obj 是一个指针 我想检查 obj 值不为零

所以现在一切都清楚了我的问题不是吗?

谢谢

【问题讨论】:

  • 您必须显示更多代码,例如结构声明。不要谈论他们,展示他们。
  • rtg 不是结构;它似乎是指向结构指针的指针。 obj,一旦你找到它,它似乎是void* 类型,这意味着取消引用它是非法的。 gdb 告诉您地址 obj 指向的 32 位对象具有全位为零的表示形式。这就是我们无需查看更多源代码即可知道的全部内容。
  • @Keith Thompson,没错,它是一个指向结构体的指针。 obj,我正在寻找的是,检查该指针的值不为零,以防止我确实尝试使用if ( rtg->mtch->initial->obj != NULL && *rtg->mtch->initial->obj = NULL) 检查的段错误,但这不正确,我该如何纠正它
  • (gdb) x rtg->mtch->initial->obj 怎么样?
  • @alk gdb 输出结果为:0x4cc660: 0x00000000

标签: c pointers null segmentation-fault


【解决方案1】:

您不能取消引用通用指针。我能想到的唯一解决方案是创建一个指向整数的临时指针来检查值。基本上

int *tmp = rtg->mtch->initial->obj;
if (*tmp != 0)
/* the rest of your code here */

强制转换也可以,但在我看来,使用临时指针会使代码更易于阅读。

【讨论】:

    【解决方案2】:

    警告是因为左侧是取消引用的char *(换句话说,char),右侧是空指针常量,形式为void *;您正在将 char 值转换为 void * 值...也许您的意思是 char **

    void *o = rtg == NULL                ? NULL
            : rtg->mtch == NULL          ? NULL
            : rtg->mtch->initial == NULL ? NULL
            : rtg->mtch->initial->obj;
    
    if (o != NULL) { /* ... */ }
    

    ...请注意,将 o 的类型更改为任何其他对象指针应该是安全的(例如,您的问题似乎暗示了char **?)

    【讨论】:

      猜你喜欢
      • 2016-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-08
      • 2013-12-23
      • 2012-03-25
      • 1970-01-01
      • 2011-06-17
      相关资源
      最近更新 更多