总是说分段错误,不知道我应该在哪里修复

时间:2016-10-16 08:46:41

标签: c linux segmentation-fault

此代码用于创建数组并对其进行排序,我的homeworks请求是计算它运行的时间。但似乎这段代码不起作用。当我输入$./sorting select v 20000时,shell说分段错误,我不知道应该在哪里修复。

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

int* insertionSort(int * arr,int len){
    for (int i=1; i<len; i++){

        int x=arr[i];
        int j=i;

        while (j>0 && x<arr[j-1]){
            arr[j]=arr[j-1];
            j--;
        }

        arr[j]=x;
    }

    return arr;
}

int*  selectionSort(int* arr,int len){
    int pos=0;

    for (int i=0; i<len;i++){
        int minpos=arr[i];

        for (int j=i; j<len; j++){
            if (minpos>arr[j]){
                minpos=arr[j];
                pos=j;
            }

        }

        int x=arr[i];
        arr[i]=minpos;
        arr[pos]=x; 
    }

    return arr;
}

int* create_array(char category, int n){
    int *arr=malloc(n*sizeof(int));

    if (category=='s'){
        for (int i=0;i<n;i++){
             arr[i]=i;
        }
    }
    else if (category=='v'){
        for (int i=n-1;i>=0;i--){
            arr[i]=i;
        }
    }
    else if (category=='r'){
        for (int i=0;i<n;i++){
            arr[i]=i;
        }
        for(int i = 0; i < n; i++){
             int j = rand() % n;   
             int t = arr[j];
             arr[j] = arr[i];
             arr[i] = t;
        }
    }
    else {return NULL;}

    return arr;
}

void main(char sort_algo,char category,int array_size){

    int *arr=create_array(category,array_size);

    if (&sort_algo == "select"){
        selectionSort(arr,array_size);
    }
    else{
        insertionSort(arr,array_size);
    }
}

1 个答案:

答案 0 :(得分:0)

你应该修改你的main函数,如果你想获取命令行参数,原型必须如下所示:

  

int main(int argc,char * argv [])

您还必须考虑WeatherVane和Bence Kaulics的建议,并阅读为更好地理解概念而建议的内容。

作为旁注,我已经修改了你的代码(最低限度),它现在就会运行。可以做很多改进。继续学习!

&#13;
&#13;
#include <stdio.h>
#include <math.h>
#include <stdint.h>
#include <stdlib.h>

int* insertionSort(int * arr,int len){
    int i;
    for (i=1; i<len; i++){

        int x=arr[i];
        int j=i;

        while (j>0 && x<arr[j-1]){
            arr[j]=arr[j-1];
            j--;
        }

        arr[j]=x;
    }

    return arr;
}

int*  selectionSort(int* arr,int len){
    int pos=0;
    int i;
    for (i=0; i<len;i++){
        int minpos=arr[i];
        int j;
        for (j=i; j<len; j++){
            if (minpos>arr[j]){
                minpos=arr[j];
                pos=j;
            }

        }

        int x=arr[i];
        arr[i]=minpos;
        arr[pos]=x;
    }

    return arr;
}

int* create_array(char category, int n){
    int *arr=malloc(n*sizeof(int));

    if (category=='s'){
        int i;
        for (i=0;i<n;i++){
             arr[i]=i;
        }
    }
    else if (category=='v'){
        int i;
        for (i=n-1;i>=0;i--){
            arr[i]=i;
            //printf("%d\n",i);
        }
    }
    else if (category=='r'){
        int i;
        for (i=0;i<n;i++){
            arr[i]=i;
        }
        for(i = 0; i < n; i++){
             int j = rand() % n;
             int t = arr[j];
             arr[j] = arr[i];
             arr[i] = t;
        }
    }
    else {return NULL;}

    return arr;
}
//main with command line arguments
int main( int argc, char *argv[] )  {
//    argv[0]  argv[1]  argc[2]   argv[3]
//    sorting select      v        20000
    int num;
    sscanf (argv[3],"%d",&num);
    int *arr=create_array(argv[2][0],num);

    if(strcmp(argv[1],"select")==0){
        selectionSort(arr,num);
    }
    else{
        insertionSort(arr,num);
    }
}
&#13;
&#13;
&#13;