2017-12-29 10 views
-3

Dies ist wahrscheinlich etwas, das leicht gelöst werden kann. Ich habe keine Ahnung, was ich falsch mache, bitte helfen Sie mit diesem super einfachen Code.Segmentation Fault beim Auffüllen eines Arrays

#include <iostream> 

using namespace std; 

int main() 
{ 
    int arraysize, i, a[arraysize], n, j; 

    cout << "array size"; 
     cin >> arraysize; 

    for(int i=0, j = arraysize; i < arraysize, j > 0; i++, j--){ 
     a[i] = j; 
     cout << "a[" << i << "] = " << a[i] << endl; 
    } 
} 

Wenn dieses Programm ausgeführt wird, wird es Ausgabe 5 Werte des Arrays, und dann bekomme ich einen Segmentation Fault. Ich habe keine Idee, wie man das repariert und/oder wie man diese Art von Problem richtig ausführt. Jede Hilfe wird geschätzt, danke.

+0

'arraysize' enthält den Wert für den Speicherfehler, wenn Sie das Array' a [arraysize] 'deklarieren. –

+0

[Konnte nicht] (http://coliru.stacked-crooked.com/a/301743aa2694a77a) mit GCC reproduzieren. Verwenden Sie keine VLAs und initialisieren Sie Ihre Variablen nicht, bevor Sie sie verwenden. – Ron

+0

Wie @AditiRawat sagt, "arraysize" enthält Müll an dem Punkt, an dem er zuerst verwendet wurde. Außerdem ist 'int a [array]] nicht gültig für C++, auch wenn in 'arraygröße' ein gültiger Wert vorhanden ist. Einige Compiler erlauben dies als Erweiterung, sollten Ihnen aber zumindest eine Warnung geben, dass das, was Sie tun, nicht koscher ist. –

Antwort

3

arraysize hat keinen festgelegten Wert, wenn a konstruiert ist, was bedeutet, dass Sie ein undefiniertes Verhalten bei der Angabe der Größe a aufgerufen haben.

Die Nicht-undefinierte Verhalten Version dieses Codes ist dies:

#include <iostream> 

//Don't use "using namespace std;"! 
//using namespace std; 

int main() 
{ 
    //removed unused/unnecessary variables 
    int arraysize; 

    std::cout << "array size"; 
     std::cin >> arraysize; 

    int a[arraysize]; 

    for(int i = 0; i < arraysize; i++) { 
     int j = arraysize - i; 
     a[i] = j; 
     std::cout << "a[" << i << "] = " << a[i] << std::endl; 
    } 
} 

JEDOCH. Die Angabe einer Array-Größe zur Laufzeit ist eine nicht standardmäßige Erweiterung der Sprache und funktioniert möglicherweise nicht in allen Umgebungen. Wenn Sie möchten, dass dieser Code standardkonform ist, müssen Sie std::vector verwenden.

#include <iostream> 
#include <vector> 

int main() 
{ 
    int arraysize; 

    std::cout << "array size"; 
     std::cin >> arraysize; 

    std::vector<int> a(arraysize); 

    for(int i = 0; i < arraysize; i++) { 
     int j = arraysize - i; 
     a[i] = j; 
     std::cout << "a[" << i << "] = " << a[i] << std::endl; 
    } 
} 

Ich habe die Verwendung von using namespace std; aus dem Code entfernt, for these reasons.

+0

Ehrlich gesagt half eine Tonne, vielen Dank. – theninja1011

0

Dies ist eindeutig undefiniertes Verhalten.
Vor allem C++ - Standard unterstützt Array variabler Länge nicht. Dies ist eine Erweiterung einiger Compiler (wie gcc).

Zweitens Wert von arraysize ist undefiniert, wenn Sie ein Array instanziiert, so dass das Ergebnis unvorhersehbar ist, kann es in einigen Fällen funktionieren, aber das beruht auf reinem Glück.

Wenn Sie ein dynamisches Array benötigen, verwenden Sie am besten std::vector.

#include <iostream> 

using namespace std; 

int main() 
{ 
    int arraysize, i, n, j; 
    std::vector<int> a; 

    cout << "array size"; 
    cin >> arraysize; 

    std::vector<int> a(arraysize); 

    for(int i=0, j = arraysize; i < arraysize, j > 0; i++, j--){ 
     a[i] = j; 
     cout << "a[" << i << "] = " << a[i] << endl; 
    } 

    return 0; 
}