我会读几行文字,所以我想把它保存在一个全局变量中。我做了这样的事情:
#include <stdbool.h>
#include <stdio.h>
static char currentLine[MAX_LINE_LENGTH];
static bool readNextLine(void)
{
return getline(¤tLine, NULL, stdin);
}
我得到的错误是
cc -Wno-unused-function -Wno-unused-variable -O2 -MD -MP -Wall -Werror -c src/parse.c -o build/parse.o
src/parse.c: In function ‘readNextLine’:
src/parse.c:14:20: error: passing argument 1 of ‘getline’ from incompatible pointer type [-Werror=incompatible-pointer-types]
return getline(¤tLine, NULL, stdin);
^
In file included from src/parse.c:2:0:
/usr/include/stdio.h:678:20: note: expected ‘char ** restrict’ but argument is of type ‘char (*)[100000]’
extern _IO_ssize_t getline (char **__restrict __lineptr,
我做错了什么?
答案 0 :(得分:1)
为变量使用正确的类型并正确使用getline()
。
char
的指针。NULL
。corrcted code:
#define _GNU_SOURCE
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
static char *currentLine = NULL;
static bool readNextLine(void)
{
size_t dummy = 0;
free(currentLine);
currentLine = NULL;
return getline(¤tLine, &dummy, stdin) >= 0;
}
答案 1 :(得分:1)
getline(¤tLine, NULL, stdin);
期望操纵两件事:char *
分配内存,大小size_t
。因此,需要传递这两个项目的地址。以下代码失败,因为getline()
无法更改currentLine[]
的地址,也未分配。{/ p>
char currentLine[MAX_LINE_LENGTH];
getline(¤tLine, NULL, stdin); // fails
相反
#include <stdbool.h>
#include <stdio.h>
static char *currentLine = NULL;
static size_t currentLineSize = 0;
// true when a line is read
static bool readNextLine(void) {
return getline(¤tLine, ¤tLineSize, stdin) >= 0;
}
注意:在最终使用缓冲区后,健壮的代码将执行最终free()
。
static void readNextLine_CleanUp(void) {
free(currentLine);
currentLine = NULL;
currentLineSize = 0;
}