Because conversion of wide characters is done according to the currently set locale. By default a C program always starts with a “C” locale which only supports ASCII characters.
You have to switch to any Russian or UTF-8 locale first:
setlocale(LC_ALL, "ru_RU.utf8"); // Russian Unicode
setlocale(LC_ALL, "en_US.utf8"); // English US Unicode
Or to a current system locale (which is likely what you need):
setlocale(LC_ALL, "");
The full program will be:
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main() {
setlocale(LC_ALL, "ru_RU.utf8");
wprintf(L"Привет, мир!\n");
}
As for your code working as-is on other machines – this is due to how libc operates there. Some implementations (like musl) do not support non-Unicode locales and thus can unconditionally translate wide characters to an UTF-8 sequence.