何时使用NULL以及何时在C中的链表中使用'\ 0'?

LED*_*tom 4 c pointers linked-list

我在C:中学到了null char == '\0' == NULL,我在下面写了一个循环来读取C中char []的开头到结尾.

// case #1
char buf[32];
while (buf[i] != NULL){
    //do something...
}  
Run Code Online (Sandbox Code Playgroud)

但是,我的gcc编译器给了我一个警告:指针和整数之间的比较.有人提到我混淆了两个不同的概念:NULL用于指针,而'\ 0'用于字符.因此,为了摆脱警告,我应该使用'\ 0',因为我的循环测试了一个char.

现在我正在编写一个链表,并测试一个头指针是否指向一个节点.因为它是struct,所以使用它是合理的,if (h1 == NULL)但显然编译器也会在我使用时编译,if (h1 == '\0')即使节点是结构但不是char.有人可以提供一些帮助,为什么在这种情况下可以使用'\ 0'和NULL,而它们不能同时用于第一种情况?

// case #2
struct ListNode {
    int val;
    struct ListNode *next;
};
Run Code Online (Sandbox Code Playgroud)

zwo*_*wol 8

这是一个非常普遍的混乱."空字符"(通常拼写为NUL,由于历史原因只有一个L)是一个比较等于零的字符."空指针"是一个比较等于零的指针.差异只是类型 - 但这是一个重要的区别.允许编译器(但不是必需)反对程序,因为您正在将字符值与空指针常量进行比较.

C有一个相当松散型的系统,尤其是当它涉及到整型常量,这样你就可以摆脱使用与正式不正确类型常量大量的时间.当它达到零时尤其如此:整数文字0可以在任何可以安全使用宏NULL或字符文字的地方使用'\0'.实际上,特别允许#define NULL 0在C标准的所有版本中使用该实现.因此,有一小部分上下文,其中绝对必须使用(T*)0一些具体类型T,不是裸,0或者NULL,例如当将空指针传递给采用可变数量的参数的函数时(例如execl).

作为混淆蛋糕上的进一步锦上添花,在C字符文字中有类型int,而不是char,并且'\0'是一个合法的空指针常量.(在C++中,这些都不是真的.)

在C,IMNSHO,最好的做法是使用'\0'的空字符,并且0- NULL -为空指针.