На каждой итерации переменных цикла bufN
создаются и уничтожаются, но они создаются по одному и тому же адресу в стеке (в противном случае циклы исчерпали бы пространство стека).
Похоже на map.put
не копирует строки, а хранит указатели на строки, ваши bufN
переменные, которые перезаписываются новыми значениями на каждой итерации, поэтому вы видите последние записанные значения.
Также обратите вниманиечто переменные bufN
больше не существуют после завершения цикла, поэтому указатели, хранящиеся в map
, становятся недействительными.Просто так получилось, что эта память не была перезаписана чем-то другим.
Исправление будет состоять в том, чтобы выделить место для всех буферов, например:
constexpr int N = 3;
char bufs[N][3][16];
for(int i = 0; i < N; ++i) {
snprintf(bufs[i][0], sizeof bufs[i][0], "%d", i);
snprintf(bufs[i][1], sizeof bufs[i][1], "Hello%d", i);
snprintf(bufs[i][2], sizeof bufs[i][2], "World%d", i);
map.put("id[]", bufs[i][0]);
map.put("test1[]", bufs[i][1]);
map.put("test2[]", bufs[i][2]);
}
Вам необходимо убедиться, что map
не пытается получить доступ к строкам после того, как переменная bufs
уничтожена (вышла из области видимости).