В приведенной ниже программе я назначил память только для 4 целых чисел, но программа, скомпилированная / построенная с помощью gcc 7.4.0, не дает сбоев. Это потому, что память рядом с назначенными 4 * 4 байтами не использовалась ...
1 ответ
Когда вы читаете или пишете за пределами выделенной памяти, вы запускаете неопределенное поведение.
При неопределенном поведении стандарт C не дает никаких гарантий относительно того, что будет делать ваша программа. Он может дать сбой, может выдать странные результаты или (как в этом случае) может показаться, что он работает правильно. Кроме того, внесение, казалось бы, несвязанного изменения, такого как добавление неиспользуемой локальной переменной или вызов printf
для отладки, может изменить способ проявления неопределенного поведения, равно как и компиляция с различными настройками оптимизации.
То, что программа может дать сбой, не означает, что это произойдет .
При этом, конкретная реализация malloc
может выделить больше памяти, чем требуется, но опять же вы не можете полагаться на это. Единственная гарантия, которую вы имеете, - это то, что вы получите именно то количество байтов, которое вы просили.
Похожие вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.