Например, когда мы звоним, говорят, рекурсивная функция, последовательные вызовы хранятся в стеке. Однако из-за ошибки, если это идет бесконечно на ошибку, 'Отказ сегментации' (как замечено на GCC).
Разве это не должно было быть 'переполнение стека'? Каково затем основное различие между двумя?
Btw, объяснение было бы более полезным, чем ссылки Википедии (прошедший это, но никакой ответ на определенный запрос).
Переполнение стека - это [] причина, ошибка сегментации - результат.
По крайней мере, на x86 и ARM «стек» - это часть памяти, зарезервированная для размещения локальных переменных и адресов возврата вызовов функций. Когда стек исчерпан, будет доступна память за пределами зарезервированной области. Но приложение не запрашивало у ядра эту память, поэтому для защиты памяти будет сгенерирован SegFault.
Современные процессоры используют диспетчеры памяти для защиты процессов друг от друга. В диспетчере памяти x86 есть много унаследованных функций, одна из которых - сегментация. Сегментация предназначена для того, чтобы программы не могли определенным образом манипулировать памятью. Например, один сегмент может быть помечен как доступный только для чтения, и код будет помещен туда, в то время как другой сегмент предназначен для чтения / записи, и туда отправляются ваши данные.
Во время переполнения стека вы исчерпываете все пространство, выделенное для одного из ваших сегментов, а затем ваша программа начинает запись в сегменты, которые не разрешены диспетчером памяти, а затем вы получаете ошибку сегментации.
Стек вызовов переполняется, однако в результате переполнения значения, связанные с вызовом, помещаются в память, которая не является частью стека, а затем - SIGSEGV
!
Переполнение стека может проявляться либо как явное исключение переполнения стека (в зависимости от компилятора и архитектуры), либо как ошибка сегментации, т. Е. Недопустимый доступ к памяти. В конечном итоге переполнение стека является результатом исчерпания пространства стека, и одним из возможных результатов нехватки пространства стека является чтение или запись в память, к которой вы не должны обращаться. Следовательно, на многих архитектурах результатом переполнения стека является ошибка доступа к памяти.