为什么这个 getline 的 return 值测试会导致无限循环?
Why does this test of getline's return value result in an infinite loop?
以下程序应该读取特定的文本文件并逐行打印其内容。但是,它会导致无限循环。为什么?
#define __STDC_WANT_LIB_EXT2__ 1
#include <stdio.h>
int main(void)
{
char *line = NULL;
size_t buf_len;
size_t line_len;
FILE *fp = fopen("README.txt", "r");
while (1) {
line_len = getline(&line, &buf_len, fp);
if (line_len < 0)
break;
printf("%s", line);
}
return 0;
}
我注意到我可以通过将 line_len < 0
更改为 line_len == -1
来解决问题,但我不明白为什么这样可以解决问题。 -1
不小于0
吗?
(C 编译器:Ubuntu 20.04 上的 gcc 9.4.0)。
line_len
是 size_t
类型,应该 link 为无符号长整型,因为它是无符号值,它永远不会低于 0,而是环绕到最高可能的值。
这可能是因为 -1
没有任何类型的注释:
unsigned long test1 = 18446744073709551615;
long test2 = -1;
printf("%d\n", test1 == test2);
returns true
因为位值相同
C 会进行一些类型转换(例如 10.0f == 10
),但如果值是内联的,它无法知道您需要它是什么类型。
以下程序应该读取特定的文本文件并逐行打印其内容。但是,它会导致无限循环。为什么?
#define __STDC_WANT_LIB_EXT2__ 1
#include <stdio.h>
int main(void)
{
char *line = NULL;
size_t buf_len;
size_t line_len;
FILE *fp = fopen("README.txt", "r");
while (1) {
line_len = getline(&line, &buf_len, fp);
if (line_len < 0)
break;
printf("%s", line);
}
return 0;
}
我注意到我可以通过将 line_len < 0
更改为 line_len == -1
来解决问题,但我不明白为什么这样可以解决问题。 -1
不小于0
吗?
(C 编译器:Ubuntu 20.04 上的 gcc 9.4.0)。
line_len
是 size_t
类型,应该 link 为无符号长整型,因为它是无符号值,它永远不会低于 0,而是环绕到最高可能的值。
这可能是因为 -1
没有任何类型的注释:
unsigned long test1 = 18446744073709551615;
long test2 = -1;
printf("%d\n", test1 == test2);
returns true
因为位值相同
C 会进行一些类型转换(例如 10.0f == 10
),但如果值是内联的,它无法知道您需要它是什么类型。