8

将 NULL 转换为 C 中的结构指针有什么好处吗?

例如:

typedef struct List
{
....
} List;

List *listPtr = ((List *) NULL) ;

来自 PostgreSQL 源的示例:

#define NIL                     ((List *) NULL)

http://doxygen.postgresql.org/pg__list_8h_source.html

4

3 回答 3

10

在赋值示例中,显式强制转换没有任何意义。但是,您的问题似乎实际上与#define NIL ((List *) NULL)宏有关,其可用性超出了赋值范围。

一个可能有意义的地方是将它传递给可变参数函数或没有原型声明的函数。该标准NULL可以以其他方式定义为0or0L((void *) 0)or ,这意味着它在这种无类型的上下文中可能会有不同的解释。显式转换将确保它被正确解释为指针。

例如,这通常是无效的(行为未定义)

void foo();

int main() {
  foo(NULL);
}

void foo(List *p) {
  /* whatever */
}

同时用

foo(NIL);

使其有效。

于 2012-08-23T14:47:12.800 回答
6

没有 null 是 null,它是你可以得到的 null,你可能认为零是相当 null,但与 null 相比,这只是花生。

于 2012-08-23T14:41:28.787 回答
4

将 NULL 转换为 C 中的结构指针有什么好处吗

没有。应该很简单:

List *listPtr = NULL;

此外,如果对象具有静态存储(例如,像全局变量),您甚至不需要将其初始化为 NULL。

于 2012-08-23T14:41:24.963 回答