如何在c编程中检查空指针,得到这个编译错误:使用了struct type value,其中标量是必需的,

时间:2012-09-14 12:54:43

标签: c pointers null structure

struct s_client *cur_client(void){
    return (struct s_client *) pthread_getspecific(getclient);
}



int32_t chk_process (int32_t) {
...
struct s_client *ptr = cur_client();

//FIXME
// how could i check in this line , just when the value of 
// ptr is not zero , then it goes to it's next line?`

send_data (ptr, index);
...
...
}

我想检查一下,只有当ptr的值不为零时,才会检查它的下一行,我试过这行代码

if (*ptr != 0)

但正如预期的那样,这是不正确的,因为它没有检查价值!

Edit2: 好吧,我找到了自己的原因,因为ptr已从pthread_getspecific中填满。如果对正在销毁其线程特定数据的键调用pthread_getspecific,则返回值NULL。有关详细信息,您可以查看手册页...故事结束

Edit1:

那么这是结构名称cur_client(),在上面的代码中使用

3 个答案:

答案 0 :(得分:2)

您可能想测试指针是否为空。如果是这样,在进行比较时不应取消引用它:

if (ptr != 0) 

或者:

if (ptr != NULL) 

答案 1 :(得分:1)

ptr是指向struct s_client的指针,而*ptr则是struct s_client本身。

您没有将指针与0进行比较,而是尝试将结构与0进行比较,这是无法完成的。

答案 2 :(得分:0)

您似乎想要检查指针指向的结构是否仅包含零。你可以这样做:

int i, isNonzero = 0;
for (i = 0; i < sizeof(*ptr); i++) {
    if (((char *)ptr)[i] != 0) {
        isNonzero = 1;
        break;
    }
}
if (isNonzero) {
    /* etc. */
}

编辑:不,ptr不是指针的地址,它是指针本身。如果要检查它,请将其与NULL进行比较。指针只是一个普通变量本身,它包含一个表示内存地址的整数。指针类型的变量(ptr是)本身就有一个地址,当你使用!=运算符时,你认为它会被比较。不,它没有 - 你必须写

if (&ptr != NULL) {
}

这样做。别担心,其他答案的建议也很好。

请尽快阅读有关C指针的教程。这是StackOverflow上要求的基本内容。