Ни один из них не является правильным.
Вы используете StringCchPrintf (), который работает с количеством символов, а не байтов. sizeof (buffer) возвращает размер буфера в байтах, как и 255 * sizeof (char). 255 * sizeof (char) также имеет недостаток в том, что вы дублируете размер массива в двух местах - если вы измените размер буфера, но забудете при вызове StringCchPrintf, у вас будет ошибка.
Это работает, так как sizeof (char) всегда равен 1.
Вы также указываете буфер как char, но используете TEXT () вокруг строки - компиляция с UNICODE приведет к разрыву.
Любое из следующих правил будет правильным:
char buffer[255];
StringCchPrintf(buffer, ARRAYSIZE(buffer), "%s", X);
TCHAR buffer[255];
StringCchPrintf(buffer, ARRAYSIZE(buffer), TEXT("%s"), X);
char buffer[255];
StringCbPrintf(buffer, sizeof(buffer), "%s", X);
TCHAR buffer[255];
StringCbPrintf(buffer, sizeof(buffer), TEXT("%s"), X);