I am looking to create an array of pointers to strings read from a file in C. However when I try to print out the strings copied to stdout, the last line of the file is always left out. 
The program also sometimes experiences a segmentation fault which I haven't been able to completely eliminated. It happens about 2 out of 5 times.
Here is my input.c code:
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "input.h"
#define MAXLINES 5000
void writelines(char *arr[], int l);
char *read_lines[MAXLINES];
void get_input(const char *fp) {
    FILE *contents;
    char *line;
    char *temp;
    size_t len;
    ssize_t read;
    int i;
    i = 0;
    contents = fopen(fp, "r");
    if (contents == NULL)
        exit(EXIT_FAILURE);
    while ((read = getline(&line, &len, contents)) != -1) {
        if ((temp = (char *) malloc(strlen(line) + 1)) == NULL) {
            printf("Could not allocate required memory.");
            exit(EXIT_FAILURE);
        }
        else {
            line[strlen(line) - 1] = '\0';
            strcpy(temp, line);
            read_lines[i++] = temp;
        }
    }
    fclose(contents);
    free(line);
    free(temp);
    writelines(read_lines, i);
    exit(EXIT_SUCCESS);
}
void writelines(char *arr[], int l) {
    int i;
    for (i = 0; i < l; i++) {
        printf("%s\n", arr[i]);
    }
}
My main.c file is:
#include <stdio.h>
#include "input.h"
int main(int argc, char *argv[]) {
    if (argc == 1)
        printf("Please provide a valid source code file.\n");
    else
        get_input(*(++argv));
    return 0;
}
I compile using gcc main.c input.c -Wall with no warnings or errors.
Using gdb I can confirm that the process runs normally.
When it experiences a segmentation fault, the back trace shows a call to strlen that apparently fails.
 
    