尝试运行程序时出现分段错误

时间:2013-11-09 08:17:53

标签: c arrays pointers segmentation-fault

此程序使用快速排序对数字进行排序,然后是代码,将负数和正数交替放置。

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

void swap(int *arr,int i,int j)
{
    int temp=arr[i];
    arr[i]=arr[j];
    arr[j]=temp;
}


int partition(int *arr,int left,int right)
{
    int temp=0;
    int i=left;
    int j=right;

    while(i<=j)
    {
        while(i<=right && arr[i]<=temp)
        i++;
        while(j>=left && arr[j]>=temp)
        j--;
        if(i<j)
        swap(arr,i,j);
    }
 return j;
}

void quick_sort(int *arr,int left,int right)
{
    if(left<right)
    {
        int pivot=partition(arr,left,right);
        quick_sort(arr,left,pivot-1);
        quick_sort(arr,pivot+1,right);
    }
    return ;
}

void nega(int *arr,int left,int right)
{
    int i;

    quick_sort(arr,left,right);

    for(i=0;i<right+1;i++)
    {
        if(arr[i]>=0)
        break;
    }
    int j=i;
    int k;
    for(i=1,k=j;i<j && k<=right;i+=2,k++)
    {
        int temp=arr[i];
        arr[i]=arr[k];
        arr[k]=temp;
    }
}


int main()
{
  int i,n;
  int arr[15];

  printf("enter the n:");
  scanf("%d",&n);

  for(i=0;i<n;i++)
  {
  printf("enter the element");
  scanf("%d",&arr[i]);
  }
    printf("debug");
   nega(arr,0,n-1);
    for(i=0;i<n;i++)
    printf("%d",arr[i]);
return 0;
}

这里代码询问用户n的值,它将n个元素放入数组中。 如果n的值是1(即,对于一个元素),它工作正常。 如果n的值> 1(超过1个元素)。它显示了分段错误。可能在函数的某个地方访问不可访问的位置。

但是,我不明白为什么它在输入代码后没有立即执行printf("debug");。它在执行printf("debug");之前直接显示分段错误而我不知道在printf("debug");之前找到任何原因导致分段错误。

有人能指出我是什么问题。谢谢。

2 个答案:

答案 0 :(得分:1)

for(i=0;i<right+1;i++)
{
    if(arr[i]>=0)
    break;
}

这部分看起来很可疑。可以永远成为最后一个元素吗?

答案 1 :(得分:0)

回答第一个问题:打印缓冲。因此,如果您编程崩溃,缓冲区尚未刷新,并且不会打印“debug”。尝试打印到stderr以进行日志记录和错误:

fprintf(stderr, "Debug");

我也会尝试回答有关segfault的问题。

更新

如果arr中的所有值都高于零,则会导致负枢轴:

while(j>=left && arr[j]>=temp)
    j--;

如果你改变:

int temp = 0;

于:     int temp = arr [left];

它不会给你一个分段错误,我认为这是你想要的。请注意,这不会修复排序算法,只会指定发生段错误的位置。