Для начала код имеет утечку памяти. Сначала была выделена память
stack = (char ** ) malloc(sizeof(char * ));
, а затем указатель stack
был переназначен с адресом указателя line
.
while (fgets(line, BUFSIZ, file) != NULL) {
stack = & line;
//…
Этот оператор
stack = (char ** ) realloc(stack, sizeof(char * ) * i);
приводит к неопределенному поведению, поскольку стек указателей после оператора
stack = & line;
не указывает на динамически выделенную память. Он указывает на локальную переменную line
.
. Кажется, вы пытаетесь сделать следующее, как показано в демонстрационной программе ниже. Только вместо файла используется стандартный поток ввода stdin
.
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main(void)
{
char *line = malloc( BUFSIZ );
char **stack = NULL;
size_t n = 0;
while ( fgets( line,BUFSIZ, stdin ) != NULL )
{
line[strcspn( line, "\n" )] = '\0';
char **tmp = realloc( stack, ( n + 1 )* sizeof( char * ) );
if ( tmp != NULL )
{
stack = tmp;
++n;
stack[n-1] = malloc( BUFSIZ );
if ( stack[n-1] != NULL ) strcpy( stack[n-1], line );
}
}
for ( size_t i = 0; i < n; i++ )
{
if ( stack[i] != NULL ) puts( stack[i] );
}
for ( size_t i = 0; i < n; i++ )
{
free( stack[i] );
}
free( stack );
free( line );
return 0;
}
Если ввести две строки
Hello
World
, тогда вывод будет
Hello
World