Когда вы пишете за пределами выделенной памяти, вы вызываете неопределенное поведение .Это означает, что вы не можете точно предсказать поведение программы.Это может привести к сбою, может привести к странным результатам или может работать неправильно.
Кроме того, внесение, казалось бы, несвязанных изменений, таких как добавление неиспользуемой локальной переменной или вызов printf
для отладки, может изменить то, как проявляется неопределенное поведение, как и компиляция с другим компилятором или с тем же компилятором с другимнастройки оптимизации.
То, что программа может аварийно завершить работу, не означает, что будет .
При этом, что , вероятно, произошло связано с тем, как malloc
реализован в вашей системе.Это, вероятно, откладывает на несколько больше байтов, чем было запрошено для выравнивания и учета.Без агрессивной оптимизации эти дополнительные байты для выравнивания, вероятно, не будут использоваться ни для чего другого, поэтому у вас не возникнет проблем с записью в них, но тогда у вас возникают проблемы, когда вы пишете дальше в байты, которые могут содержать внутренние структуры, используемые malloc
и free
что вы испортили.
Но опять же, вы не можете зависеть от этого поведения.C зависит от разработчика, который будет следовать правилам, и если вы не сделаете ничего плохого.