#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct data_list {
    struct data_list *next;
    char data[];
};

int main(int argc, char **argv)
{
    int res;
    char buf[1024];
    struct data_list data_list = { 0 }, *p;
    int l;

    fputs("文字列を入力してください。ctrl-dで終了:\n", stderr);
    for (;;) {
        fputs("? ", stderr);
        if (fgets(buf, sizeof(buf) - 1, stdin) == NULL)
            break;
        l = strlen(buf);
        for (p = &data_list; p->next != NULL; p = p->next);
        p->next = malloc(sizeof(data_list) + l + 1);
        if (p->next == NULL) {
            perror("Mallocに失敗しました");
            res = 1;
            goto PG_END;
        }
        p->next->next = NULL;
        strcpy(p->next->data, buf);
    }
    putc('\n', stderr);

    for (p = data_list.next; p != NULL; p = p->next)
        fputs(p->data, stdout);

    res = 0;
  PG_END:;
    // free
    for (p = data_list.next; p; p = p->next)
        free(p);
    return res;
}