将指针强制转换为void *然后与NULL

时间:2019-06-08 23:58:32

标签: c pointers casting void-pointers

我正在做作业,并且由于我们的约束条件非常严格,因此如果我想100%进行检查,则需要在各处检查NULL指针。因此,我做了一个内联函数,用于检查NULL的指针:

static inline void exit_on_null(void* ptr, const char* msg) {
    if ( ! ptr ) {
        printf("%s\n", msg);
        exit(1);
    }
}

现在我问自己这样做安全吗?根据标准,我知道将指针投射到void*并返回并接收原始指针是省钱的。这是否使该指针的void*版本仍然可以与NULL相提并论,或者我可以遇到一些陷阱?例如,以下内容始终正确吗?

ptr = NULL
(void*) ptr == NULL

2 个答案:

答案 0 :(得分:2)

我自己在标准中找到了答案:

  

6.3.2.3指针

     

4将空指针转换为另一种指针类型将产生该类型的空指针。任何两个空指针应比较相等。

答案 1 :(得分:0)

您认为这不安全吗?但是不要这样做

static inline void exit_on_null(void* ptr, const char* msg) {
    if (!*(void **)ptr) {
        printf("%s\n", msg);
        exit(1);
    }
}
// segfault
exit_on_null(NULL, "yeet");