Почему меняется значение поля структуры?
В программе мы записываем в поле структуры number.str значение поля number.num, которое равно 1025. Но у символьного массива number.str размерность задана так, что это значение не влезет в массив, для корректного выполнения программы размерность символьного массива number.str должны быть равна 5. Но при выполнении программы значение поля number.num почему то меняется на 1024.
#include <stdio.h>
typedef struct
{
char str[3];
int num;
} NumberRepr;
void format (NumberRepr* number)
{
sprintf(number->str, "%3d", number->num);
}
int main()
{
NumberRepr number = { .num = 1025 };
format(&number);
printf("str: %s\n", number.str);
printf("num: %d\n", number.num);
return 0;
}
Ответы (1 шт):
Вообще-то по большому счету выход за пределы массива - уже UB и пояснять, как именно и что именно происходит - дело дурное.
Тем не менее, вероятно, происходит следующее: выравнивание на 4 байта приводит к такому размещению в памяти: 3 байта str, 1 байт заполнителя для выравнивания, 4 байта num.
## ## ## $$ nn nn nn nn
Будем считать, что изначально все байты нулевые:
00 00 00 00 00 00 00 00
Записываем в num 1025 (в 16-ричной системе):
00 00 00 00 01 04 00 00
Записываем 5 байт 1025 с нулевым в конце:
31 30 32 35 00 04 00 00
Итак, младший байт num благополучно занулен, и в num теперь 1024.
Вопросы есть?