2017-10-24 10 views
1

私はコースワークのためのプログラムを書いています。基本的には配列の要素をソートしてソート後にそのインデックスを見つけることです。私は、Mac OS端末は、私にこのエラーが発生します(最初の入力に)18383833として大きな入力を入力します。 セグメンテーションフォールト:11配列とソートC

ここでは私のコードです:

#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

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

+2

ようこそスタックオーバーフロー!あなたの質問を編集して、どのようなデバッグを行ったのか教えてください。私はValgrindまたは類似のチェッカー内であなたの[mcve]を実行し、たとえばGDBなどのデバッガーで調査したと思います。完全なコンパイラ警告を有効にしたことを確認してください。ツールはあなたに何を伝えましたか、どの情報が欠落していますか? Eric Lippertの[小さなプログラムをデバッグする方法](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を読んでください。 –

+2

あなたの可変長配列は、あなたのプラットフォームのローカル変数サイズの制限を超えている可能性があります。代わりに( 'malloc()'または 'calloc()')を動的に割り当ててみてください。 –

答えて

4

問題は、この行にあります:

int array[y]; 

メモリはスタックに割り当てられ、スタック領域はかなり制限されているため、メモリは爆発します。

はでそれを置き換えます。

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

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

、それが動作するはずです。

+0

* at int *配列は使用する必要はありません。 –

+0

@SumukhBhandarkarはいそうです。それを削除し、コンパイルして何が起こるかを確認してください。 –