如何在C中检查struct的成员是否为NULL?

时间:2011-11-02 18:21:31

标签: c

我在检查结构的成员是否为null时遇到了问题。例如:

typedef struct {
    int value;
} A;

int main() {
   A *foo = malloc(sizeof(A));
   foo->value++; // obviously, null pointer error
}

然后我尝试通过以下方式检查值是否为NULL:

if (foo->value != NULL) {
    foo->value++;
}

但是发生了错误:指针和整数之间的比较。

我该怎么办?请注意,在我的情况下,将其设置为0不是一种选择。

6 个答案:

答案 0 :(得分:6)

你可能意味着

if (foo)
    foo->value++;

你的评论“显然是空指针错误”对我来说并不那么明显。

答案 1 :(得分:6)

foo->value++; // obviously, null pointer error

对我来说不是很明显为什么这是一个错误。 valueint,而不是int *,那么它怎么能成为NULL指针?

我认为您打算执行以下检查

A *foo = malloc(sizeof(A));
if( foo != NULL ) {
  foo->value++; // increment value
} else {
  // allocation failed, do something about it
}

malloc为结构分配足够的内存以包含该结构的所有成员时;你没有为每个成员分配内存。

请注意,malloc调用后,结构本身的内容未初始化。要将成员设置为确定性状态,您可以执行以下任一操作:

  • foo->value = 0;同样初始化所有其他成员
  • memset( foo, 0, sizeof(*foo) );这会将结构中的所有位设置为零
  • A *foo = calloc( 1, sizeof(A) ); calloc自动将零初始化已分配的内存

答案 2 :(得分:1)

int不是指针。它不能是NULL(或者至少该值与零无法区分)。

答案 3 :(得分:0)

这是一个int,而不是指针,因此将它与NULL进行比较没有多大意义。如果您希望能够这样做,那么您需要在结构中将其声明为int*。否则,只需确保在创建结构时将其初始化为0.

为了扩展上述内容,重要的是要注意当malloc()结构时,该int的空间在malloc()提供的空间中是ALREADY。结构字面上包含int,而不仅仅是指向它的指针。

答案 4 :(得分:0)

int类型不是指针,因此它不能是NULL指针。当您创建一个结构时,会为您的值分配足够的空间,但您仍需要初始化其内容,否则它们将被设置为之前在已分配空间中的内容,有时最好使用另一个函数完成。

A *createA()
{
    A *a = malloc(sizeof(A));
    //TODO: make sure a is no null
    a->value = 0;
    return a;
}

现在,调用createA将始终返回一个int值设置为0的结构。

答案 5 :(得分:0)

正如其他人所指出的,int不是指针类型,不能为NULL。但是,我相信你试图通过“明显的空指针错误”评论得到的结论是,从malloc获得的内存未初始化,因此foo->value++不一定会留下1。要解决此问题,您可以使用calloc或memset:

释放calloc:

int main() {
   A *foo = calloc(1, sizeof(A)); // returns 0'd memory
   foo->value++;
}

memset的:

int main() {
   A *foo = malloc(sizeof(A));
   memset(foo, 0, sizeof(*foo)); // sets the contents of the struct to 0
   foo->value++;
}

你也可以手动0字段,这样可以正常工作,但你可以保持开放状态,忘记将稍后添加到结构中的新字段归零。