programmaallocazione della memoria per il programma C
#include<stdio.h>
int a=10;
void main()
{
int i=0;
printf("global = %p, local = %p\n",&a,&i);
main();
}
uscita
[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$
Il programma sopra ottiene errore di segmentazione. Perché, il principale si chiama in modo ricorsivo. Quanto segue è l'assegnazione della memoria ad un programma C.
allocazione di memoria
__________________ __________________
| | | |
| 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)
Quindi, mi aspetto che viene mostrato come in figura (b), la chiamata principale in modo ricorsivo. Se raggiunge il segmento di dati, si verifica la collisione. Se si verifica, non c'è più spazio da allocare per la funzione principale. Quindi, ottiene errore di errore di segmentazione. Quindi, usando il programma di cui sopra, lo sperimento. Su quel programma, l'indirizzo della variabile globale 'a' è "0x804a014". Ogni volta che viene chiamato main, viene dichiarata la variabile locale "i". Quindi, I si aspetta, prima dell'errore di segmentazione, l'indirizzo di i è quasi l'indirizzo di 'a'. Ma entrambi gli indirizzi sono molto diversi. Quindi, cosa sta succedendo qui?
Perché l'indirizzo di 'a' e 'i' non è nello stesso intervallo al momento dell'errore di errore di segmentazione. Quindi, come verificare se il main raggiunge la dimensione dello stack e viene sovraccaricato?
mette in pausa il programma e dà un'occhiata a/proc/pid/maps - ci sono altre cose, come le librerie. Inoltre, esiste un limite effettivo alle dimensioni dello stack (ulimit) – Petesh
È possibile stampare gli indirizzi degli oggetti dalle librerie? Dì, & stdin? O stdin? –
@Petesh Questa è la dimensione dello stack: bf99c000-bfa39000 rw-p 00000000 00:00 0 [stack] – mrg