检查malloc'ed指针是否为NULL

时间:2018-03-26 03:57:02

标签: c pointers struct

我有以下代码(此处已简化)。

#include <stdio.h>
#include <stdlib.h>
struct inner {
    int a;
    int b;
};

struct outer {
    struct inner *next;
    struct inner *prev;

};


int main(int argc, char *argv[]) {
    struct outer *c = malloc(sizeof(struct outer));

    if (c->next) {
        printf("here\n");
    }

    if (c->next != NULL) {
        printf("here too");
    }
}

如上所示,c仅分配了内存,因此c->nextc->prev为NULL地址。但两份印刷报表仍然有效。仅当if不是空指针时,如何使c->next语句起作用?

4 个答案:

答案 0 :(得分:5)

一个。 malloc()未将内存初始化为零,因此您的指针不一定是NULL

B中。访问未初始化的指针会导致未定义的行为

℃。 c->nextc->next != NULL基本上是相同的条件检查

答案 1 :(得分:5)

您已使用malloc()分配内存,但不保证内存设置为零 如果您使用过calloc(),那么所有内存都会被设置为零,您会找到c->nextc->prevNULL

答案 2 :(得分:1)

你的假设

  

如上所示,c只分配了内存,因此c-&gt; next和c-&gt; prev是NULL地址

是个问题。虽然您确实为外部结构分配了内存,但无法保证它已初始化为0。指针可能指向垃圾地址。

如果你想让它们为NULL,你可以:

struct outer *c = malloc(sizeof(struct outer));
memset(c, 0, sizeof(struct outer));

答案 3 :(得分:1)

您尚未将指针设置为任何内容。您只为其分配了空间,但未初始化

分配空间不会自动初始化任何内容。