разбиване на стека, открито от getline & printf - и наистина не мога да разбера защо

що се отнася до 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(tabs), записани в терминала. Между другото, съобщението за грешка, което получавам е: stack smashing detected *: ./afile terminated Segmentation fault


person Ro Pedersen    schedule 28.01.2012    source източник
comment
Опитайте да инициализирате line = NULL   -  person wildplasser    schedule 28.01.2012
comment
char **line не ми се струва правилен   -  person Jim Rhodes    schedule 28.01.2012


Отговори (3)


getline очаква аргумент от тип char**, а вие сте предоставили &line, което е char***. Освен това getline действа върху текущата стойност на стойността, към която сочат първите му аргументи (така че стойността на line), а вие не сте го инициализирали. Променете програмата си на:

char *line = NULL;

и трябва да е добре.

person thiton    schedule 28.01.2012

Не успяхте да инициализирате променливата line и тя съдържа произволна стойност. Readline вероятно се опитва да го realloc(). АКТУАЛИЗАЦИЯ: дефиницията за линия също е грешна, необходим е само един астерикс, както е посочено от други.

int main(void )
{
    FILE *fp1;
    char *filename;
    char *line = NULL; /* <- here */
    size_t *sz;
    int s;

    ...
}
person wildplasser    schedule 28.01.2012

Вашите пренасочвания на показалеца са непоследователни. Променливата линия е декларирана:

char **line;

Което е указател към указател към символ или указател към низ. getline() очаква указател към низ, но предавате &line - указател към указател към низ.

И накрая, зададеният формат на printf() е %s, иска ли да форматира низ, но вие му давате указател към низ.

Накратко: премахнете звездичка, за да създадете

char *line;
person Community    schedule 28.01.2012