strcpy(list[i*MENULEN], buf);

Warum mal *MENULEN?
Du schreibst damit meilenweit aus deinem Array aus.
strcpy(list[i], buf);

Dein Array ist ja eigentlich eine Liste von char pointern.
Für jeden char pointer allokierst du speicher. Und dann willst du den Speicher der von dem Char Pointer an der Stelle i allokiert wird mit Text beschreiben.

Eine Sache außerdem noch: Du solltest aufpassen, dass dir nicht der Speicher ausgeht. Das sind dann nämlich wirklich komische Fehler und die sind in der Konstruktion nicht zur Compilezeit zu erkennen.