2016-07-30 3 views
1

Was ist falsch an meinem Programm? Es funktioniert gut auf meinem PC, aber in IDEone gibt es die korrekte Ausgabe aber zeigt Laufzeitfehler. Bitte helfen Sie.Warum zeigt IDEone einen Laufzeitfehler an, obwohl er die Ausgabe erhalten hat?

#include<bits/stdc++.h> 

using namespace std; 

struct student 
{ 
    int vote; 
}; 


int main() 
{ 
    int t; 
    cin>>t; 

    while(t--) 
    { 
     int count=0; 
     int n; 
     cin>>n; 
     vector <int> a(n); 
     student s[n]; 
     int k; 
     cin>>k; 

     for(int i=1;i<=n;i++) 
     { 
      s[i].vote=0; 
     } 


     for(int i=1;i<=n;i++) 
     { 
      cin>>a[i]; 
     } 
     int temp=0; 

     for(int i=1;i<=n;i++) 
     { 
      if(a[i] != i) 
      { 
       temp=a[i]; 
       s[temp].vote++; 
      } 
     } 

     for(int i=1;i<=n;i++) 
     { 
      if(s[i].vote==k) 
      { 
       count++; 
      } 
     } 

      printf("%d\n",count); 

     } 
return 0; 
} 

Dies ist der Fehler in IDEone gezeigt: -

Fehler in `./prog ': free(): ungültige nächste Größe (schnell): 0x085cca10

+0

Geben Sie -4 als Eingabe ein und sehen Sie, was passiert. :-) Geben Sie auch -2 als nächsten Parameter ein. –

+1

Sieht aus wie ein gutes Thema, um einen Debugger zu verwenden. Durchlaufen Sie den Code und bestimmen Sie, welche Anweisung das Problem verursacht. Lassen Sie uns wissen, welche Aussage der Schuldige ist. –

+0

BTW, Variable Length Arrays (VLA) sind keine C++ Sache (die Aussage 'Student s [n]'. Verwenden Sie einen 'std :: vector' oder * dynamisch den Speicher zuweisen mit' operator new' *. –

Antwort

1
student s[n]; 

Dies deklariert ein Array namens s. Es enthält n Werte. Die Werte sind s[0] bis s[n-1] (Sie können sie alle auf Ihren Fingern zählen, wenn Sie möchten, mit einer kleinen Anzahl von n, wie 5).

for(int i=1;i<=n;i++) 
    { 
     s[i].vote=0; 
    } 

Diese Versuche Werte s[1] durch s[n] zu initialisieren. Das einzige Problem ist, dass s[n] nicht existiert. Der letzte Wert im Array ist s[n-1]. Dieser Code beschädigt den Speicher auf dem Stack, was zu einem nicht definierten Verhalten führt.

Derselbe Fehler tritt auch mit dem Array a auf.

+0

Aber dann, warum bekomme ich die richtige Ausgabe? –

+0

Da dieser Fehler zu "undefiniertem Verhalten" führt. Undefiniertes Verhalten bedeutet: jedes Ergebnis kann vorkommen. Dazu gehören: 1) korrekte Ausgabe; 2) korrekte Ausgabe gefolgt von einem Absturz; 3) völlig zufällige, falsche Ausgabe; 4) Ihr Computer fängt Feuer; 5) das gleiche, was in Ghostbusters (1984) fast passiert ist: alles Leben, wie du es kennst, hört augenblicklich auf und jedes Molekül in deinem Körper explodiert mit Lichtgeschwindigkeit. Irgendeines von diesen trifft die Definition von "undefiniertem Verhalten". –

+0

OK: 'D danke für die Antwort –

0

Der Index Werte für vector und Array sind nullbasiert und gehen bis zu n - 1. Also

for(int i = 0; i != n; ++i) 

wäre besser.

Jetzt schreiben Sie ein Element zu weit, das free später herausfindet, wenn die Daten nach dem Speicherblock ungültig sind.

Verwandte Themen