2016-05-09 16 views
-3
#include<stdio.h> 
#include<conio.h> 

int main() 
{ 

    int i, j, array[10] = { 1,2,3,4,5,6,7,8,9,10 }; 
    modify(); 

    for (i = 0; i<10; i++) 
    { 
     printf("Origional Array is:"); 
     printf(" %d\n", array[i]); 

    } 

    modify(array); 

    for (i = 0; i<10; i++) 
    { 
     printf("New Array:"); 
     printf("%d\n", array[i]); 
    } 

    system("pause"); 
} 

modify(int array[10]) 
{ 
    int j; 
    for (j = 0; j<10; j++) 
    { 
     array[j] = array[j] * 3; 
    } 
    return array[j]; 
} 

Es gibt keine Kompilierzeit Fehler ... aber zur Laufzeit zeigt dieses Signal Sigsegg Segmentierung Fehler. bitte hilf mir ...! [Bitte beachten Sie, dass diese Antwort geht davon aus, dass der Code tatsächlich C und nicht C++]Empfangssignal SIGSEGV Segmentierungsfehler

+1

C++ erlaubt keine Funktionen, ohne einen Rückgabetyp anzugeben. Ignorieren Conio, [siehe hier] (http://coliru.stacked-crooked.com/a/7e275a22f1a13172) für einige Fehler, die Ihr Compiler * Ihnen * geben sollte. (Bearbeiten) Was Ihr Problem angeht, wäre ein Debugger eine große Hilfe. Sie können herausfinden, wo es abstürzt und gehen Schritt für Schritt zu diesem Punkt, beobachten Sie variable Werte und verstehen Sie, warum der Absturz auftritt. – chris

+0

dann bitte helfen Sie mir ... können Sie meinen Code korrigieren ..? –

+1

Das sieht wie C-Code aus. 'modify' hat einen impliziten' int' Rückgabewert. Gab es eine Compiler-Warnung, die Sie ignoriert haben? – jxh

Antwort

1

Es gibt ein paar Probleme mit Ihrem Code.

Die Faust ist dies:

modify(); 

Sie hier Aufruf die Funktion, bevor Sie die Compiler gesagt haben, dass es existiert. Anscheinend sagt dein Compiler, dass es in Ordnung ist, was es wirklich nicht ist. Was wahrscheinlich passiert, ist, dass der Compiler (fantastisches Wort für "Raten") folgert, dass die Funktion keine Argumente annimmt und nichts zurückgibt. I.e. sehen, dass die Erklärung wie

void modify(void); 

Diese „Erraten“ wurde in der älteren Standards von C erlaubt, aber seit dem C99-Standard wurde diese implizite Deklaration entfernt und würden Sie einen Fehler in einem konformen Compiler. später

Ein wenig tun Sie

modify(array); 

die wiederum die Funktion aufruft, aber da der Compiler denkt, dass die Funktion keine Argumente nehmen, niemand wird tatsächlich weitergegeben werden. Was zum schlimmsten Problem von allen führt: In der tatsächlichen modify Funktion verwenden Sie ein Argument, aber da keine tatsächlich übergeben wird, wird die Variable nicht initialisiert und Sie haben undefined Verhalten versuchen, diesen Zeiger zu dereferenzieren (Arrays verfällt zu Zeigern, wenn als Argumente an Funktionen übergeben) und Sie werden höchstwahrscheinlich Ihren Absturz dort haben.

Es gibt auch die von der Funktion zurückkehrt:

return array[j]; 

Hier ist der Wert von j wird 10 sein, die außerhalb der Grenzen für das Array ist, dass Sie passieren (na ja, versuchen passieren) an die Funktion.

Um das Problem zu lösen, fügen Sie die Funktion Prototyp Deklaration irgendwo vor dem Aufruf der Funktion, ein üblicher Ort wäre im globalen Bereich kurz vor der main Funktion. So etwas wie

... 
int modify(int *array); 

int main(void) 
{ 
    ... 
} 
... 

und befestigen Sie die return Anweisung in der Funktion.

+0

Joachim Pileborg ... danke vielmals ...! –

+0

@Joachim Nur aus Neugier: Tja, sehr oft schlagen Sie (natürlich richtige) Antworten für sehr individuelle Probleme vor. Wie passt das zu dem allgemein verdächtigten Q & A-Schema, das für zukünftige Forschung hilfreich sein könnte, und was sind Ihre besonderen Punkte, die Sie beantworten möchten, oder schließen Sie einfach die Abstimmung ab (Duplikate beiseite)? –

+1

Soweit ich mich erinnerte, hatten implizite Deklarationen die Form 'int foo();', nämlich eine ganzzahlige Rückgabe und eine beliebige Anzahl von Parametern. – chris