(1) - ошибка, поскольку list [0] изначально имеет значение NULL, поэтому вы фактически написали
*NULL = *s;
Вместо этого вы должны написать
list[0] = new string;
*list[0] = *s;
или просто
list[0] = new string(*s);
(2) не является ошибкой, но * (список [0]) будет существовать только до тех пор, пока существует * s.Если вы измените * s, то * (список [0]) также изменится.Вы также должны удалить либо s, либо list [0], но не оба.Если вам действительно не нужно это поведение, (2) уродливо.
В общем, я не понимаю, зачем вам здесь указатели.Следовательно,
string* list = new string[5];
будет намного чище, а
vector<string> list(5);
будет еще лучше.
Наконец, не стоит называть что-то "списком"msgstr ", так как есть стандартный контейнер с этим именем.(Не называйте ничего «vector», «set», «string», «stack» или «map»).