在C语言中,(char *)0是什么意思?

5
if ( fgets( line, sizeof(line), stdin ) == (char*) 0 )...

我不明白这行代码的作用,有人知道吗?


你不明白它的哪些部分? - crazyscot
1
@Martinho:你能详细说明一下吗? - Oliver Charlesworth
@Martinho:是的,这是真的。当然,如果“line”是实际的数组类型,它就起作用。 - Oliver Charlesworth
@Oli:把fgets误认为是gets :) 只有当line是char* line;并且分配给它的空间小于sizeof(char*)时,才会出现UB。 - R. Martinho Fernandes
6个回答

4

这是一种非常奇怪的编写方式,用于测试 fgets() 返回空指针表示错误的情况。

我会这样写:

if (!fgets(line, sizeof(line), stdin))

4
那是个人口味问题。我的个人口味总是喜欢与 NULL 进行比较,因为这符合函数的语义(它不返回布尔值)。 - Oliver Charlesworth
我同意Oli的观点,这个观点也得到了广泛认可的MISRA-C标准的支持。只有布尔表达式应该使用布尔运算符进行比较。 - Lundin
@Oli @Lundin 我的感觉是,你不能把一只母猪的耳朵做成丝质钱包,试图这样做也没有什么意义。 - David Heffernan

4
(char*) 0

这不是一个空字符,而是指向地址0处的字符指针。

一个包含值0的字符将会是:

(char) 0

1
它不是一个指向地址0的字符指针,而是一个指向空字符的指针 (http://www.lysator.liu.se/c/c-faq/c-1.html) - KevinDTimm
@KevinDTimm char* c = (char*) 0 指向0,无论那里有什么值(尽管在大多数平台上它都是非法内存)。 - Hyperboreus
@compile-fan类型不同。在大多数实现中,字面量0应该是int类型(即作为int和n位整数的宽度与寄存器一样宽)。 (char*) 仅将其转换为 char 指针。 - Hyperboreus
(char *)1 代表什么意思? - compile-fan

2

这意味着一个指向char类型的空指针。如果你将(char*)0替换为NULL,结果将是相同的。在这种情况下,它检查stdin中是否没有更多可读取的内容。我认为这只是一种神秘而炫酷的展示方式,展示了一些美丽而壮观的特性。如果你使用NULL代替它,可以提高可读性,而不会改变语义。


实际上,它意味着一个指向空字符的指针-这是有区别的。 - KevinDTimm
1
@Kevin 其实不是这样的。fgets()返回一个可能为NULL的指针。因此,这段代码只是一种奇怪的将结果与NULL进行比较的方式,并没有与nul字符有任何关系。 - Lundin
忽略fgets()函数,IMHO (char *)0 表示指向空字符的指针,或者是指向空的字符指针,而不是空指针指向字符——这似乎只是语义上的区别,但我相信它们之间有所不同。 - KevinDTimm
这并不意味着一个指向 "null 字符" 的指针,它是(char)0。在这种情况下,指针为零,而要成为指向 null 字符的指针,该指针必须为非空并指向首字节设置为 0 的内存地址。 - Jamie

1
该行代码检查 fgets 是否返回 0。将其转换为 char* 类型只是为了匹配 fgets 的返回类型。
char * fgets ( char * str, int num, FILE * stream );

但是如果你删除它,0会被隐式转换为char*

如果您需要更多关于fgets的信息,请查看这里


1

(char*)0 创建了“null”指针。因此,您正在检查 fgets 的值是否为空。

fgets 的文档声明,当出现错误或达到文件结尾时,它返回 null 。

完整语句似乎是在检查是否已到达文件末尾,如果是,则中止(虽然这只是猜测)。


-2

这只是检查fgets的结果是否为null字符指针。

根据cplusplus.com

返回值

成功时,该函数返回相同的str参数。如果遇到文件结束符并且没有读取任何字符,则str的内容保持不变,并返回空指针。

如果发生错误,则返回空指针。

使用ferror或feof之一来检查是否发生错误或已达到文件结束符。


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