C: Динамически хранить строки (динамических размеров!)?
Я скучаю по чему-то невероятно простому? потому что я не могу найти причину, по которой мой код не хранит строки динамически. Все, что я получаю, это пустые строки, когда я печатаю их в конце. Предполагается распечатать последние "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 ответ
Решение
size_t *maxlength;
*maxlength = sizeof(char) * 10;
Вы разыменовываете дикий (неназначенный) указатель.
Вместо этого должно быть:
size_t maxlength = sizeof(char) * 10;
// ...
char *lineptr = malloc(sizeof(char) * maxlength);
// ...
while((c = getline(&lineptr, &maxlength, stdin)) > 1)
Затем вы просто используете автоматическую переменную.