C: Динамически хранить строки (динамических размеров!)? - PullRequest
0 голосов
/ 07 октября 2010

Мне не хватает чего-то невероятно простого?потому что я не могу найти причину, по которой мой код не хранит строки динамически.Все, что я получаю, это пустые строки, когда я печатаю их в конце.Предполагается распечатать последние "n" строк произвольного числа строк.Кажется, есть проблема с хранением фактических строк, хотя.Кто-нибудь может протянуть руку?

Кстати, это НЕ HW.Это проблема из книги K & R (чьи ответы онлайн).Я пытаюсь выучить C самостоятельно.

void tail5_13(int n)
{

    int maxpoint = 3;
    size_t *maxlength;
    *maxlength = sizeof(char) * 10;

    char **pointptr = malloc(sizeof(void *) * maxpoint);
    char **pointcnt = pointptr;

    char *lineptr = malloc(sizeof(char) * *maxlength);

    int numlines = 0;
    int printnum = 0;
    int c;



    while((c = getline(&lineptr, maxlength, stdin)) > 1)
    {
        if(numlines < maxpoint)
        {
            storeline5_13(pointcnt, lineptr, c);
            pointcnt++;
        }
        else
        {
            maxpoint *= 2;
            printf("Increased pointer amount to %d\n", maxpoint);
            pointptr = (char **) realloc(pointptr, sizeof(void *) * maxpoint);
            storeline5_13(pointcnt, lineptr, c);
            pointcnt++;
        }
        numlines++;
    }

    if(n <= numlines)
        printnum = n;
    else
        printnum = numlines;

    while(printnum-- > 0 )
    {
        printf("%s\n", *(pointcnt-1));
    }

}



void storeline5_13(char** pointcnt, char* line, int length)
{


    *pointcnt = (char *) malloc(sizeof(char) * length);

    while(*line != '\n')
    {
        *((*pointcnt)++) = *line++;

    }

    **pointcnt = '\0';


}

1 Ответ

4 голосов
/ 07 октября 2010
size_t *maxlength;
*maxlength = sizeof(char) * 10;

Вы разыменовываете указатель wild (unassigned).

Вместо этого должно быть:

size_t maxlength = sizeof(char) * 10;
// ...
char *lineptr = malloc(sizeof(char) * maxlength);
// ...
while((c = getline(&lineptr, &maxlength, stdin)) > 1)

Тогда вы просто используете автоматическую переменную.

...