Когда printf
захватывает необязательные переменные (т. Е. Переменные после char *
, указывающие, что печатать), он должен убрать их из стека.double
обычно составляет 64 бита (8 байтов), тогда как int
составляет 32 бита (4 байта).
Более того, числа с плавающей запятой имеют нечетную внутреннюю структуру по сравнению с целыми числами.
Поскольку вы передаете int
вместо double
, printf
пытается получить 8 байтов из стека вместо четырех, и он пытается интерпретировать байты int
как байтыdouble
.
Так что вы не только получаете 4 байта памяти, содержащей , никто не знает, что , но вы также интерпретируете эту память - это 4 байта int
и4 байта случайного материала из ниоткуда - как если бы это был double
.
Так что да, странные вещи произойдут.Когда вы перекомпилируете (или даже время перезапускаете ) программу, которая просто произвольно выбирает вещи из памяти, где у нее нет malloc
'd и она не сохранена, вы собираетесьчтобы получить непредсказуемые и дико изменяющиеся значения.
Не делайте этого.