getline&amp ;;“堆栈粉碎检测” printf - 我真的无法弄清楚为什么

时间:2012-01-28 13:56:25

标签: c gcc overflow

当谈到C时我不是菜鸟 - 我更像是一个总和&完全愚蠢无知的菜鸟!我正在尝试编写一个程序来解析简单的文本文件,我想尽可能地使它(为什么我使用getline)。这是我的代码:

//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已终止     分段错误

3 个答案:

答案 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**类型的参数,并提供&linechar***。此外,getline作用于其第一个参数指向的值的当前值(因此,line的值),并且您没有对其进行初始化。将您的计划更改为:

char *line = NULL;

它应该没问题。

答案 2 :(得分:1)

您的指针重定向不一致。声明变量行:

char **line;

指向字符的指针或指向字符串的指针。 getline()需要一个指向字符串的指针,但是你传递&amp; line - 一个指向字符串的指针。

最后,你指定的printf()格式是%s,它是否要格式化字符串,但你给它一个指向字符串的指针。

长话短说:删除星号以创建

char *line;