//afile.c
#include <stdio.h>
#include <stdlib.h>
main( )
{FILE *fp1;
char *filename;
char **line;
size_t *sz;
int s;
filename = "n";
if ((fp1 = fopen(filename,"r")) == NULL ){printf("error...");return 1;}
do {
s = getline(&line,sz,fp1);
if (s != -1)
printf(" %s \n",line);//<-- %s seems to be wrong! %*s removes the gcc warning
} while (s != EOF);
fclose(fp1);}
我很确定它的一些指针分配问题,但我真的无法弄清楚它在哪里。我发现用% s替换%s会使编译器警告消失,但会导致在终端中写入无限的\ t(制表符)。 顺便说一句,我得到的错误信息是: 检测到堆栈粉碎* :./ ifile已终止 分段错误
答案 0 :(得分:2)
您无法初始化线变量,并且它包含随机值。 Readline可能会尝试realloc()它。 更新:行的定义也是错误的,只需要一个asterix,正如其他人所指出的那样。
int main(void )
{
FILE *fp1;
char *filename;
char *line = NULL; /* <- here */
size_t *sz;
int s;
...
}
答案 1 :(得分:2)
getline
需要char**
类型的参数,并提供&line
,char***
。此外,getline
作用于其第一个参数指向的值的当前值(因此,line
的值),并且您没有对其进行初始化。将您的计划更改为:
char *line = NULL;
它应该没问题。
答案 2 :(得分:1)
您的指针重定向不一致。声明变量行:
char **line;
指向字符的指针或指向字符串的指针。 getline()需要一个指向字符串的指针,但是你传递&amp; line - 一个指向字符串的指针。
最后,你指定的printf()格式是%s,它是否要格式化字符串,但你给它一个指向字符串的指针。
长话短说:删除星号以创建
char *line;