Вы предполагаете, что память после конца строк будет содержать значение NULL, которое может или не может быть - оно неинициализировано, поэтому оно может содержать что угодно. Вам повезло с некоторыми небольшими наборами данных, и они содержат нули, так что это работает. Для больших наборов данных вы сталкиваетесь с областью памяти, в которой есть что-то еще, и она терпит неудачу. Если вы хотите, чтобы строки были равны NULL после набора указателей, содержащих данные из вызовов fgets (), вам нужно выделить его достаточно большим, чтобы содержать дополнительный указатель, и установить это пространство в NULL.
char **getLines(FILE *pFile)
{
int nLines = 0;
/* Start lines big enough to hold at least the NULL */
size_t memRes = sizeof(char *);
char **lines = malloc(memRes);
lines[0] = NULL; /* the memory returned by malloc must be initialized */
char *current = (char*) malloc(20);
while(fgets(current, 20, pFile) != NULL)
{
memRes += sizeof(char*);
lines = realloc(lines, memRes);
lines[nLines + 1] = NULL; /* Prepare the NULL to terminate display loop */
lines[nLines] = malloc(20);
strcpy(lines[nLines], current);
nLines++;
}
free(current);
return lines;
}
void printLines(char **lines)
{
int lineI = 0;
while(lines[lineI] != NULL)
{
printf("%s", lines[lineI]);
lineI++;
}
}