繁体   English   中英

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

[英]how to check the value of pointer (void) not be zero (Attempt to dereference a generic pointer)

抱歉,这必须是一个非常简单的问题,但是由于我以diffrenet的方式尝试了但没有成功,因此我必须在这里进行确认。 C语言编程

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

我检查时使用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;

首字母为LL_NODE

obj是我要检查obj值不为零的指针

所以现在我的问题已经很清楚了,不是吗?

谢谢

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

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) { /* ... */ }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM