对不起,这一定是一个非常简单的问题,但由于我尝试了不同的方式没有任何成功,我必须在这里问,以确保。C语言编程:
有一个结构体名称rtg
。编辑:匹配类型是LLIST初始化类型为LL_NODE对象指针类型(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-> match ->initial->obj是指向不为零的值?(以防止上述段故障)我的意思是,如果我检查if (rtg->mtch->initial->obj)
,它只是检查指针obj,地址不为零(这不是我打算的,我打算检查该指针的值不为零(但当我在检查gdb之前使用*时,它说"尝试解引用一个泛型指针"。那么,检查该值不为零(并防止此段故障)的正确方法是什么?
编辑:i had try this
if (*((char *) rtg->mtch->initial->obj) != NULL)
但是我得到编译警告:
警告:指针与整型
比较
EDIT2,源代码中定义了什么
ECM_REQUEST是structECM_REQUEST rtg优先;
首字母是LL_NODE
obj是一个指针我想检查obj值是否为0
所以现在我的问题都清楚了,不是吗?
谢谢
不能解引用泛型指针。我能想到的唯一解决方案是创建一个临时的integer指针来检查值。基本上
int *tmp = rtg->mtch->initial->obj;
if (*tmp != 0)
/* the rest of your code here */
强制转换也可以工作,但是在我看来,使用临时指针使代码更容易阅读。
这个警告是因为左边是一个解引用的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) { /* ... */ }
…请注意,将0的类型更改为任何其他对象指针(例如:你的问题似乎暗示char **
?)