Здесь, кажется, есть некоторое недопонимание, как именно assert
функционирует.Макрос assert
выполняет проверку заданного условия во время выполнения.Если это условие ложно, это приводит к прерыванию программы.
В этом случае значение i
находится в диапазоне от 0 до 15 внутри цикла.На итерациях, где значение i
меньше 8, утверждение проходит.Но как только i
становится 8, утверждение не выполняется, что приводит к прерыванию программы.Неудачное утверждение не приведет к тому, что программа, например, пропустит следующую итерацию цикла.
Правильный способ справиться с этим - ограничить счетчик цикла, чтобы он не выходил за пределы:
for (i=0; i<sizeof(buf); i++)
Язык C сам по себе не выполняет проверку границ, как некоторые другие языки.Это часть того, что делает это быстро.Это также означает, что язык доверяет разработчику не делать такие вещи, как чтение / запись вне границ массива.Разрушение этого доверия приводит к неопределенному поведению .Поэтому вам нужно убедиться, что этого не произойдет.
Есть также инструменты, такие как valgrind, которые помогут выявить неправильное управление памятью.