2017-10-24 4 views
1

Ich schreibe ein Programm für eine Kursarbeit, im Grunde seine Idee ist es, ein Element in einem Array vor dem Sortieren zu verfolgen und seinen Index nach dem Sortieren zu finden.Es funktioniert für Zahlen bis ca. 9999 denke ich aber wann ich betrete einen großen Eingang als 18383833 (am ersten Eingang) der mac OS Terminal gibt mir diese Fehlermeldung: Segmentierungsfehler: 11Arrays und Sortierung in C

hier ist mein Code:

#include <stdio.h> 
#include<stdlib.h> 

void swap(int *xp, int *yp) 
{ 
    int temp = *xp; 
    *xp = *yp; 
    *yp = temp; 
} 

// A function to implement bubble sort                                            
void bubbleSort(int arr[], int n) 
{ 
    int i, j; 
    for (i = 0; i < n-1; i++) 
     // Last i elements are already in place                                          
     for (j = 0; j < n-i-1; j++) 
      if (arr[j] > arr[j+1]) 
       swap(&arr[j], &arr[j+1]); 
} 

int main() 
{ 
    int y; // 2nd INPUT : the nth order of the arriving person                                      
    printf("Enter the nth order of the arriving person \n"); 
    scanf("%i" , & y); 
    int array[y]; // array to store the values of the number of people   in queue                               
    int i; //loop counter                                               
    printf("Enter the value of ticket of the first person \n"); 
    scanf("%i " , & array[0]); 
    printf("\n"); 

    for(i=1 ; i<y ; i++) { 
     array[i]= (31334 * array[i-1]) % 31337; 
     //printf(" %i \n" , array[i]);                                            
    } 

    int r; //loop counter                                               
    bubbleSort(array , y); 

    for(r=0 ; r<y ; r++) { 
     printf("%d (%i) \n" , array[r] , r); 
    } 
} 
+2

ohne Bezug '"% i "' -> '"% i "' – BLUEPIXY

+2

Willkommen bei Stack Overflow! Bitte [bearbeiten] Sie Ihre Frage, um uns zu zeigen, welche Art von Debugging Sie durchgeführt haben. Ich erwarte, dass Sie Ihren [mcve] in Valgrind oder einem ähnlichen Checker ausgeführt haben und mit einem Debugger, wie zum Beispiel GDB, untersucht haben. Stellen Sie sicher, dass Sie auch einen vollständigen Satz von Compiler-Warnungen aktiviert haben. Was haben die Tools Ihnen gesagt und welche Informationen fehlen ihnen? Und lesen Sie Eric Lippert [Wie kleine Programme zu debuggen] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

+2

Höchstwahrscheinlich überschreitet Ihr Array mit variabler Länge die Grenzen Ihrer Plattform für die lokale Variablengröße - versuchen Sie stattdessen, dynamisch (mit 'malloc()' oder 'calloc()') zuzuweisen. –

Antwort

4

das Problem auf dieser Linie ist:

int array[y]; 

Der Speicher ist auf dem Stack zugewiesen, und da der Stack-Bereich ziemlich begrenzt ist, explodiert er.

Ersetzen Sie ihn durch:

int *array = malloc(y * sizeof(*array)); 

if (array == NULL) 
{ 
    printf("Not enough memory\n"); 
    exit(1); 
} 

und es sollte funktionieren.

+0

Das Array * at int * muss nicht verwendet werden. –

+0

@SumukhBhandarkar ja es tut. Entfernen Sie es und versuchen Sie, es zu kompilieren und zu sehen, was passiert. –