Переполнение стека и ошибка сегментации - PullRequest
2 голосов
/ 19 августа 2011

В случае переполнения стека возникает ошибка сегментации, когда выполняется эта бесконечная рекурсия. Я ожидал сообщение об ошибке типа «Переполнение стека»!

#include <stdio.h>
int main(){
static int a=1;
printf("%d\n",a);
a++;
main();
return 0;
}

Ответы [ 4 ]

4 голосов
/ 19 августа 2011

Это вызовет ошибку сегментации , потому что стек переполнится.

Что происходит, когда каждый вызов main помещает еще несколько данных в стек, чтобы ваша программа знала, куда перейтиоднажды это return с main().В конце концов вам не хватит места в стеке (переполнение стека).В этот момент ваш следующий вызов main попытается отправить данные в стек.Поскольку в стеке больше нет доступного пространства, он случайно выполнит запись в недопустимую область памяти, что вызовет ошибку сегментации.Это похоже на то, когда вы пишете после конца массива.

2 голосов
/ 19 августа 2011

Переполнение стека является причиной ; эффект переполнения стека является (во многих случаях) ошибкой сегментации.В зависимости от операционной системы, архитектуры и среды выполнения, сможет ли код, который создает сообщение об ошибке, определить, что причиной было переполнение стека.Но большинство не пытается попробовать.

0 голосов
/ 19 августа 2011

Как и другие, ранее опубликованные, это зависит от среды (ОС, аппаратное обеспечение, компилятор и т. Д.).В зависимости от этого сообщение об ошибке может не отражать фактическую причину (как часто при недопустимом доступе к памяти).Тем не менее, запуск его в чем-то вроде valgrind всегда должен давать вам достоверную информацию о причине такого доступа.

0 голосов
/ 19 августа 2011

Вы делаете только переполнение int.

После достижения его максимального значения оно становится его значением минус.

Эта рекурсия разбьет ваш стек вызовов!

void lol()
{
lol();
}

Вот для переполнения буфера: https://www.owasp.org/index.php/Buffer_Overflow

Это не ошибка программирования, а проблема безопасности.

Как будто вы не проверяете пароль ввода len, и парень посылает вам 4000000 символов, которые переполнят ваш символ *, если len объявлен как char [6].

...