如何检查指针(void)的值不为零(尝试取消引用通用指针)

时间:2013-03-06 15:47:30

标签: c pointers null segmentation-fault

对不起它一定是一个非常简单的问题,但是因为我尝试使用diffrenet方式而没有任何成功,所以我必须在这里问一下这个问题。 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是struct ECM_REQUEST rtg; 在这个结构中将mtch定义为LLIST mtch;

initial是LL_NODE

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

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

由于

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

警告是因为左侧是解除引用的char *(换句话说,char),而右侧是空指针常量,形式为{{1 }};您将void *值转换为char值...也许您的意思是void *

char **

...请注意,将o的类型更改为任何其他对象指针应该是安全的(例如,您的问题似乎建议void *o = rtg == NULL ? NULL : rtg->mtch == NULL ? NULL : rtg->mtch->initial == NULL ? NULL : rtg->mtch->initial->obj; if (o != NULL) { /* ... */ } ?)