cstring*
- это просто указатель, обычно четыре или восемь байтов. sizeof (cstring*)
, следовательно, небольшое число, обычно четыре или восемь.
Вы не выделяете достаточно памяти для данных, достаточно памяти для хранения указателей на данные.
sizeof(cstring*)*pcount
слишком мало. Расчет размера ошибочен.
Избегайте ошибок выделения. Используйте эту идиому для кода, который легче писать правильно, просматривать и поддерживать. Обратите внимание, что не используется тип .
pointer = malloc(sizeof *pointer * n);
Тогда код становится:
// options = malloc(sizeof(cstring*)*pcount);
options = malloc(sizeof *options * pcount);`