Усекает ли sprintf дополнительные символы при переполнении буфера назначения?
Здравствуйте Друзья,
Я исправлял ошибку , связанную с sprintf, ниже приведен код:
float initial_temp_setpoint = 60; sprintf( bc_buffer, "\n\rVTM: NOT bc_vap_state_off: bc_cf_auto_vap_standby_enable: NOT bc_vap_standby_warmup_completed: warmup time=INC: setpoint<ALI3_STARTUP_COOL: initial_temp_setpoint from bc_vap_standby_temp=AT_ALI3_STARTUP_COOL_DEF_TEMP=%f",initial_temp_setpoint);
Примечание: bc_buffer-это глобальный массив символов размером 200. Однако, согласно приведенному выше коду sprintf записывает в него ~223 байта данных.
Я думал, что код рухнет, но этого не произошло, он напечатал вывод правильно, как показано ниже:
Цитата:ВТМ: не bc_vap_state_off: bc_cf_auto_vap_standby_enable: не bc_vap_standby_warmup_completed: время прогрева=ИНК: заданное значение&ЛТ;ali3_startup_cool: initial_temp_setpoint="" от=""
bc_vap_standby_temp="AT_ALI3_STARTUP_COOL_DEF_TEMP=60.000000</blockquote">
Я ожидал аварии. Я думал исправить это с помощью snprintf, чтобы избежать переполнения памяти.
Но это привело бы к усеченному журналу. Так что, я думаю, чтобы увеличить размер bc_buffer в том числе нулевое, особенно новогодний. Но поскольку это глобальная переменная, я немного опасаюсь, так как не хочу играть с глобальными данными, и это также может повлиять на карту памяти.
Может ли это поведение быть связано с компилятором?
Я бы запросил предложения.
Спасибо,
Рахул глаг
Что я уже пробовал:
Я опробовал приведенный выше код в eclipse и Visual studio, но он печатает всю строку, а не усекается.
Я также установил точку останова для просмотра данных bc_buffer, как показано ниже:
(x)=bc_buffer[197] char 83 'S'
(x)=bc_buffer[198] char 84 'T'
(x)=bc_buffer[199] char 65 'A'
Как вы можете видеть выше, последний charecter-это "A", а не нулевой charecter, тем не менее он печатает всю строку из 223 байт.