【发布时间】: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