我实际上是在尝试从用户那里获取一行文本,然后将其反转。
#define LENGTH 0xFF
char *buffer = malloc(LENGTH), *output = malloc(LENGTH);
unsigned char length_read, count = 0;
length_read = getline(&buffer, 0, stdin);
while (length_read >= 0)
output[count++] = buffer[length_read--];
理论上,output
的值应与buffer
的取反。但是,当我运行程序时,getline
似乎并没有停止从键盘上读取输入,并且程序也没有前进。我在-std=c11
中使用gcc。出于好奇,我在调用printf
的行的两侧分别对getline
进行了两次调用,并打印了它们的输出。我不确定我做错了什么或误解了。
答案 0 :(得分:3)
在您的代码中,您拥有:
char *buffer = malloc(LENGTH);
unsigned char length_read;
length_read = getline(&buffer, 0, stdin);
是什么让您认为可以传递长度为null的指针? getline()
的POSIX规范当然不允许这样做-它要求函数可以写入*n
。我也没有在getline(3)
的Linux手册页中看到任何帮助。我认为您正在使用不确定的行为;我很惊讶您不仅崩溃了。
另外,如果您的两个printf()
语句都打印出来,则getline()
本身不会卡住。
使用unsigned char
作为getline()
的返回值将导致死亡-它返回的ssize_t
通常至少为4个字节,通常为8个字节长。您可能会误解它返回的内容,尤其是当遇到EOF并返回-1
时(并且-1
是遇到EOF而不是EOF
时的返回值,尽管两者通常是相同的)。
更典型的用法是:
char *buffer = 0;
size_t buflen = 0;
ssize_t length_read = getline(&buffer, &buflen, stdin);
即使输入失败,也不要忘记释放buffer
;即使立即获得EOF,也可能已经分配了内存。