Wo ist lokale variable zugeordnet? Heap oder stack?
http://www-ee.eng.hawaii.edu/~tep/EE160/Book/chap14/subsection2.1.1.8.html
Diese Seite sagt, dass lokale Variablen und Parameter übergeben werden, die auf den stack, So habe ich versucht:
#include <stdio.h>
#include <stdlib.h>
#define A 2000000
#define B 2
typedef struct {
int a[A][A];
} st;
void fun(st s){}
void main()
{
st s;
//fun(s);
}
Kein Fehler gemeldet, nachdem Sie kompiliert und ausgeführt. Aber wenn ich de-kommentieren //fun(s)
, Dann SIGSEGV gefangen ist. Kann jemand sagen warum?
- Die Antwort steht im Titel...
- Haben Sie keine 16 TB virtuellen Speicher auf Ihrem Computer?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Genau.
Speicher auf dem stack ist viel eingeschränkter als auf dem heap1. Du bist die Zuteilung 2000000x2000000 array auf dem stack und dann übergabe an eine Funktion. Dies ist sehr wahrscheinlich übersteigen die verfügbaren Stapelspeicher, was zu einem segmentation fault.
Als dafür, warum das "segmentation fault" nicht geschehen, wenn der Aufruf der Funktion ist auskommentiert. Vor allem, als Jonathan Leffer darauf hingewiesen, dass der compiler wird wahrscheinlich optimieren
s
komplett Weg, weil es nicht verwendet wird. Aber selbst wenn nicht, Sie möglicherweise nicht erhalten, ein segmentation Fault, weil die Zuteilung von Speicher auf dem stack bedeutet nur das Inkrementieren des stack-pointer. Und auf den meisten Implementierungen, die selbst nie die Ursache segmenetation Schuld. Der segmentation fault wird nur passieren, wenn Sie versuchen, Zugriff auf den Speicher, und das system erkennt Sie überschreiten die Grenzen des Stacks (und in diesem Fall der gesamte Speicher).1 Obwohl in diesem Fall, dass nicht einen Unterschied machen, weil, wie slugonamission darauf hingewiesen, dass der array nimmt bis 16TB und somit größer sind als der verfügbare Speicher auf dem heap sowie.
int
.Zusätzlich, das ist ein gutes Beispiel, warum man lediglich pass-Funktion argument durch Wert und in der Regel übergeben Sie argument per Referenz:
Ich glaube nicht, dass es überhaupt läuft, da es erfordert eine 4TB Speicher auf dem stack. Und es kompiliert und läuft reibungslos mit
//fun(s)
im code, da der ungenutztes
variable gedumpten durch den compiler und nicht erklärt, auf Laufzeit.