在C语言中将NULL转换为结构体指针?

8

3
这对我来说毫无意义。您可以将NULL分配给任何指针,不需要进行任何类型转换。 - Kiril Kirov
4个回答

10
在赋值示例中,显式转换没有有用的意义。然而,似乎问题实际上是关于 #define NIL ((List *) NULL) 宏的使用性,其适用范围超出了赋值。
可能有一种情况是当你将它传递给可变参数函数或声明不带原型的函数时,它可能有意义。标准的 NULL 可以定义为0 或者 0L 或者 ((void *) 0) 或以其他方式定义,这意味着在这些无类型上下文中可能会有不同的解释。显式转换将确保正确地将其解释为指针。
例如,这通常是无效的(行为未定义):
void foo();

int main() {
  foo(NULL);
}

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

用以下内容替换该调用

foo(NIL);
使其有效。

6

没有 null 就是 null,它就像你能想到的那么 null。你可能认为零很 null,但与 null 相比只是小巫见大巫。


2
这个新一代还有一些银河系漫游指南的粉丝呢;-) - Martin Beckett
哦,不好意思,不是这样的。sizeof(NULL) 可以因 NULL 定义方式不同而有 18 的变化。 - Jens Gustedt
@JensGustedt 这只是我们宇宙中 NULL 的表示。 - Martin Beckett

4
有没有将NULL转换为C中的结构指针的好处?
没有好处。应该只是这样:
List *listPtr = NULL;

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

0

是的,有好处。

在这个例子中,你可以使用size_of_attribute()宏来确定特定结构体属性的大小(以字节为单位),而不必实际创建所述结构的实例

#define size_of_attribute(Struct, Attribute) sizeof(((Struct*)NULL)->Attribute)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接