Я вижу несколько ошибок в вашем коде.
1) Вы объявляете «путь» как массив из 12 символьных указателей, но ни для одного из элементов массива не выделена память.Оператор sprintf гарантированно копируется в мусорную память.Я удивлен, что это не приведет к сбою вашей программы сразу.
2) И даже если для массива пути была выделена память, ваш оператор sprintf всегда копирует в путь [0] - перезаписывая то, что уже было там.
Я подозреваю, что вы путаете массивы символов, строки и массивы строк в C / C ++.Возможно, приведенный ниже код поможет.Я предполагаю , что ваш класс "Card" не сохраняет копию строки, переданной в качестве второго параметра, в переменную-член (по крайней мере, без ее копирования).В противном случае он будет указывать на стековую память - что может привести к ошибкам, если ваш экземпляр Card переживает функцию, в которой он был создан.
const size_t MAX_INTEGER_LENGTH = sizeof(int) * 4; // 4x the sizeof int will suffice no matter what the sizeof(int) is
char szPostfix[] = "_Card.bmp";
for(int i = 0; i < 20; i++)
{
char path[MAX_INTEGER_LENGTH + sizeof(szPostfix) + 1]; //+1 for null terminator
sprintf(path,"%d%s",i, szPostfix);
cards[i] = new Card(i,path);
}