Это довольно просто. Ваша программа имеет неопределенное поведение (если мои предположения о is()
верны).
is(int, length)
возвращает std::string
по значению. Вы получаете указатель на некоторую внутреннюю структуру в этом string
, используя c_str()
. Эта строка затем уничтожается в конце полного выражения . Это уничтожение делает недействительными указатели, которые вы получили от c_str()
.
Это означает, что вы заполняете массив указателями на недопустимую память. Затем вы читаете из этих указателей, чтобы распечатать содержимое массива. Чтение из недействительной памяти приводит к неопределенному поведению.
Возможное объяснение наблюдаемого поведения таково:
Каждый string
, возвращаемый is
, повторно использует одну и ту же память. В первом цикле вы читаете из памяти, прежде чем она будет перезаписана другим вызовом is
, и вы получите правильное значение. Во втором цикле вы читаете из памяти после того, как она была перезаписана, и, таким образом, вы получаете окончательное значение в массиве.