2

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

有一个结构名称rtg。编辑: mtch 的类型是 LLIST 初始类型是 LL_NODE obj 的类型是指针(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 值不为零

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

谢谢

4

2 回答 2

1

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

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

演员表也可以工作,但在我看来,有一个临时指针会使代码更容易阅读。

于 2013-03-06T16:31:01.800 回答
0

警告是因为左侧是取消引用char *(换句话说, a char),而右侧是空指针常量,形式为 a 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 **?)

于 2013-03-06T16:55:50.127 回答