2010-12-14 2 views
0

ich eine globale Variable in meinem Programm Passing erklärt:Arrays an Funktionen durch ihre Namen in C

double mat[3200][3200]; 

beim Passieren dieses Array(), um fwrite durch die Variablennamen als Argument verwenden, erhalte ich Stack-Überlauf zur Laufzeit geworfen.

fwrite(mat, sizeof(double), 3200*3200, fid); 

Warum ist das? Sollte der Compiler die Variable mat nicht durch einen Zeiger auf das erste Element ersetzen?

Ich habe gelesen here und here, und kann immer noch nicht verstehen.

+3

Fügen Sie den Code ein, in dem Sie das Array initialisieren, und rufen Sie 'fwrite()' auf. –

Antwort

1

Ein Stapelüberlauffehler kann entweder auf eine unendliche Rekursion zurückzuführen sein (unwahrscheinlich in Ihrem Beispiel) oder auf zu viele Daten, die auf dem Stapel übergeben wurden (Parameter). Es scheint, dass Ihr Array von Kopie, nicht von Adresse weitergegeben wird.

können Sie versuchen, den Anruf zu ersetzen durch

fwrite(&(mat[0][0]), sizeof(double), 3200*3200, fid); 

Ein statisches Array kein Zeiger ist.

+0

Hallo jv42, das ist meine Frage genau: Warum wird mein Array nach Wert übergeben? Ihre Lösung ist ein guter Workaround, tho. – liorda

+0

Nun, das ist etwas aus der C-Spezifikation zu zitieren. Ein statisches Array (dh ein Array mit fester Größe) ist nicht äquivalent zu einem Zeiger auf sein erstes Element, es wird vom C-Compiler unterschiedlich gehandhabt. – jv42

+0

Sind Sie sich über diese Unterscheidung sicher? AFAIK, der Name einer Array-Variablen wird immer dann in einen Zeiger auf das erste Element konvertiert, wenn sie als R-Wert bezeichnet wird. Leider habe ich keine Kopie des C-Standard-Handys, um es zu durchsuchen. – Praetorian

1

Wird das Array auf dem Stack erstellt? Zum Beispiel, erstellen Sie das Array so?

void foo() 
{ 
    double mat[3200][3200]; 

    // ... other stuff 

    fwrite(mat, sizeof(double), 3200*3200, fid); 
} 

Wenn ja, sind Sie sicher, dass es fwrite und nicht die Array-Deklaration selbst ist, der den Stapelüberlauf verursacht? Das Array belegt 3200 * 3200 * 8 = 81920000 Bytes (etwa 78 MiB), wahrscheinlich etwas zu groß für eine Stack-Zuweisung. Versuchen Sie malloc stattdessen das Array.

+0

Hi Praetorian, die Variable ist global, d. H. Im äußersten Bereich deklariert, und ich glaube, dass sie auf dem Stack zugewiesen ist. – liorda

+1

Globale Variablen sollten sich im statischen Speicher befinden, der sich nicht auf dem Stack befindet. Das ist also nicht das Problem. –

+0

@liorda: Globale Daten werden nicht auf dem Stack erstellt, sondern in einigen implementierungsdefinierten Bereichen wie '.bss' oder' .data'. Wenn du den äußersten Bereich sagst, meinst du das innerhalb von 'main()' oder einer anderen Funktion oder außerhalb jeder Funktion auf Dateiebene? – Praetorian

0

Ich vermute, dass die Variable (nach dem Stapel) nach Wert übergeben wurde. Danke an alle, die mir geholfen haben, das herauszufinden.

Verwandte Themen