Wie überwinden Stack-Größe-Problem mit Visual Studio (Ausführung C codes mit großen Arrays)
Ich bin mit Visual Studio 13 zum kompilieren der c-codes für die erste Zeit. Die codes laufen einwandfrei O. K. mit 2d-arays der Größe 64*64 (es gibt ein paar arrays in meinem Programm) aber wenn ich vergrößern Sie die array-Größe auf 128*128 läuft es nicht (aber ordnungsgemäß kompiliert). Stattdessen gibt es eine Nachricht ".exe funktioniert nicht mehr". Meine Maschine hat 4GB ram und das gleiche Programm mit 128*128 array, wenn ich die codes von linux.
Lassen Sie mich hier einige weitere details: ich habe den gleichen code von linux mit dem Intel C-Compiler (nicht-kommerzielle version) in der gleichen Maschine. Aber aufgrund einiger problem ich bin jetzt gezwungen, Arbeit aus einer Windows-Umgebung. Ich habe gesucht und installiert habe zwei c - Compiler (1) Visual Studio 13 (2) Borland C Beide auch mit einem kleinen array. Aber in dem moment ich die array-Größe von Visual Studio geben Sie die Nachricht ".exe funktioniert nicht mehr". Compiliere ich das Programm mit 'cl' aus "Entwickler-Eingabeaufforderung VS 13".
Ich das Gefühl, dass das problem mit stack-Größe.
In den link ausführliche Erklärung (wie unten angegeben) habe ich gesehen, dass ein Befehl "ulimit" im linux-Umfeld zur Erhöhung der stack-Größe. Ich erinnere mich, mit es vor ein paar Jahren.
Ich glaube, wir sind nahe an der Lösung, aber mein problem mit Windows (und VS 2013) bleibt, wenn ich Fehler beim ausführen dumpbin /headers executable_file
oder editbin /STACK:size
. Eigentlich habe ich das Gefühl, ich weiß nicht, wie Sie ausführen. Ich habe versucht, führen Sie Sie von "Developer-Eingabeaufforderung VS 13" als auch mit "Ausführen" (windows-start-unten->suchen (ausführen)->Run (stützen)). Ich bitte Sie freundlich um mehr details zu liefern, wenn möglich.
Suchte ich und fand diese website, und denke, dass hier die Lösung gefunden werden kann.
Bitte helfen. Ich möchte ausführen, die mit Visual Studio 13 von Windows.
ohne weiterzulesen, ich Wette, VS funktioniert!
Dies ist nicht, weil "Visual Studio funktioniert nicht".
128*128 = 16384
. Wenn man zu wenig stack-Speicher und definieren Sie ein array, das groß genug Strukturen, kann dies leicht dazu führen, dass ein stack-überlauf.Ich bin sorry, wenn meine Frage hat weh jeder Stimmung oder eine Verordnung, die direkt oder indirekt. Keine intension zu brechen die Regeln dieses Forums.
InformationsquelleAutor user3129690 | 2013-12-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es scheint, dass der Grund hinter diesem ist die stack-überlauf. Das Problem kann gelöst werden, durch die Erhöhung der stack-Größe.
In visual studio können Sie dies tun, indem Sie mit
/STACK:reserve[,commit]
. Lesen Sie die MSDN-Artikel.Weitere ausführliche Erklärung:
Unter Windows-Plattformen, die stack-Größe Informationen in der ausführbaren Dateien. Es kann eingestellt werden, während der Kompilierung in Visual studio C++.
Alternativ bietet Microsoft ein Programm
editbin.exe
die können dieausführbare Dateien direkt. Hier sind mehr details:
Windows (während der Kompilierung):
Project->Setting
.Link
Seite.Category to Output
.Reserve:
Feld unterStack
. zBallocations
32768
im dezimal-oder0x20000
im Hexadezimalformat.Windows (ändern Sie die ausführbare Datei):
Gibt es zwei Programme, die in Microsoft Visual Studio
dumpbin.exe
undeditbin.exe
. Führen Siedumpbin /headers executable_file
, und Sie können sehen, diesize of stack reserve
Informationen inoptional header values
. Führen Sieeditbin /STACK:size
ändern Sie die Standard-stack-Größe.Ja. Halten Auge auf meine Antwort. Nach wenigen Minuten wird klar sein.
Stack-overflow kann nicht angesprochen werden, durch Erhöhung der heap-Größe.
Jetzt bearbeitet.
Danke. Ich habe überwunden, das problem mit den Befehlen dumpbin und editbin. Natürlich benötigte ich ein wenig Hilfe von google-Suche aber endlich deinen Vorschlag steht aus. Ich kann jetzt die codes mit größeren array-Größe. Ich nehme auch diese Gelegenheit, danke dem forum.
InformationsquelleAutor haccks
Obwohl ich sehe das nicht VS als eine gültige Entwicklungs-tool, bezweifle ich stark, dass es Ihr problem verursachen.
128 * 128 16384. Wenn man zu wenig stack-Speicher (auf Windows, es ist 1MB standardmäßig, wenn ich mich nicht Irre), und definieren Sie ein array von e ist. g. groß genug
struct
s (Größe 64 bytes, genauer gesagt), dann kann dies leicht dazu führen, dass ein stack-überlauf, da die automatische arrays sind in der Regel (obwohl nicht notwendigerweise) auf dem Stapel reserviert.InformationsquelleAutor
Es klingt wie Sie versuchen zu erklären, große arrays auf den stack. Stack-Speicher ist in der Regel begrenzt; es klingt wie Sie sind überfüllt.
Können Sie dieses Problem beheben, indem Sie das array statisch Dauer
oder durch die dynamische Zuweisung von Speicher für die es
BigStruct
ist nicht einem C-Schlüsselwort. Deine Frage hat nicht gesagt, was Sie hatte, ein array von daher war es ein Platzhalter für die array-Typ. Wenn Sie möchten, ein array von doubles mit statischen Dauer, verwenden Siestatic double arr[128]128];
Ich Schreibe normalen einfachen Programm zu simulieren klassische strömungs-Probleme, wie flow Vergangenheit kreisförmigen Zylinder usw. Die arrays werden zum speichern von verschiedenen flow-Variablen, Geschwindigkeit usw. Wie ich schon erwähnt das gesamte Programm eingestellt werden kann, verwenden Sie malloc (verkettete Liste), die werden Speicher wirtschaftlich, sondern gleichzeitig für einfache problem einführen, die viele, viele Dinge, die ich vermeiden möchte. Ich würde jetzt versuchen mit 'static double arr[128][128];" Lass mich sehen, wie er ausführt. Danke für die Anregung.
InformationsquelleAutor simonc