Программа
#include<stdio.h>
int a=10;
void main()
{
int i=0;
printf("global = %p, local = %p\n",&a,&i);
main();
}
Выход
[email protected]:~/Advanced_Unix/Chapter7$ ./a.out
global = 0x804a014, local = 0xbfff983c
global = 0x804a014, local = 0xbfff980c
.
.
.
global = 0x804a014, local = 0xbf7fac9c
global = 0x804a014, local = 0xbf7fac6c
global = 0x804a014, local = 0xbf7fac3c
Segmentation fault (core dumped)
[email protected]:~/Advanced_Unix/Chapter7$
Вышеупомянутая программа получает ошибку сегментации Error. Потому что главный рекурсивно получает вызов. Ниже приведена память выделение для программы C.
выделение памяти
__________________ __________________
| | | |
| stack | | Main |
| ↓ | |----------------|
------------------ | Main |
| | |----------------|
| <Un Allocated| | Main |
| space> | |----------------|
------------------ | Main |
| | |----------------|
| ↑ | | Main |
| Heap | |----------------|
| | | Main |
| | |----------------|
__________________ |////////////////| ---> Collision occurs. So, Segmentation fault Occurs.
| | |________________|
| data | | data |
__________________ |________________|
| text | | text |
__________________ |________________|
Figure(a) Figure(b)
Итак, я ожидаю, что показано, как показано на рисунке (b), главный вызов рекурсивно. Если он достигает сегмента данных, происходит столкновение. Если это происходит, больше нет места для выделения для основной функции. Таким образом, он получает ошибку ошибки сегментации. Поэтому, используя описанную выше программу, я ее экспериментирую. В этой программе адрес глобальной переменной "a" равен "0x804a014". Каждый раз, когда вызывается main, объявляется локальная переменная i. Так что я ожидайте, перед ошибкой сегментации адрес я близок к адресу 'a'. Но, оба адреса очень разные. Так что здесь происходит.
Почему адрес "a" и "i" находится не в том же диапазоне во время ошибки ошибки сегментации. Итак, как перекрестно проверить, main достигает размера стека и переполняется?