...
odp foo;
foo.f = i;
wchar_t loopStr[1]; //A
foo.pstr = loopStr; //B
foo.pstr[0] = base[i]; //C
vec.push_back(foo);
...
A - Вы выделяете массив (размером 1) для стека
B - Вы назначаете foo.pstr для указания на массив в стеке
C - Вы назначаете base [i] первому элементу массива (который находится в стеке)
После того, как цикл for выходит из своего текущего цикла, переменная loopStr больше не находится в области видимости, а ее содержимое не определено. В следующей итерации цикла больше всего будет использоваться один и тот же адрес памяти (следовательно, почему вы получаете то же значение при печати в конце). Если у вас включена оптимизация, ваш компилятор C может предупредить вас о получении адресов локальных переменных (хотя я сомневаюсь в этом).
Без использования выделения кучи, я думаю, что единственный вариант - это исправить размер foo.pstr в odp, т.е.
struct odp {
int f;
wchar_t pstr[1];
};
или выделите массив в куче как часть инициализации odp
...
odp foo;
foo.f = i;
foo.pstr = new wchar_t [1];
foo.pstr[0] = base[i];
vec.push_back(foo);
...
лучше использовать std :: wstring, поскольку вы используете c ++, и пусть он выполняет выделение памяти и управление ею за вас.