这个程序中的分段错误是什么

时间:2017-03-12 04:17:39

标签: c arrays segmentation-fault

 #include<stdio.h>
 #include <stdlib.h>
 int main()
 {
         int n,small=0,large=0,s,l,temp;
         printf("this should work");
         scanf("%d",&n);
          //   printf("%d",n);//
         int a[n];
        for(int i=0;i<n;i++)
             {
              scanf("%d",&a[i]);
              }
             /*    for(int i=0;i<n;i++)
                          printf("%d",a[i]);*/
        small=a[0];
        large=a[n-1];
        for(int i=0;i<n;i++)
        {
               if(a[i]<small && i!=0)
               {  
                       small=a[i];
                       s=i;
                }
                if(a[i]>large && i!=n-1)
                { 
                        large=a[i];
                        l=i;
                 }
        }
        temp=a[s];
        a[s]=a[l];
        a[l]=a[s];
        for(int i=0;i<n;i++)
              printf("%d ",a[i]);
         return 0;
  }

这是一个简单的程序,用于交换数组中最大和最小的数字并打印新数组。 当我尝试运行此程序时,我遇到了分段错误。 通常,当我们尝试访问超出范围的内存位置时会发生分段错误。 所以我添加了printf语句来找出错误的位置。 但是没有执行任何打印语句。这里的错误是什么?

3 个答案:

答案 0 :(得分:5)

一个问题是,除非您发现的元素小于/大于当前元素,否则您实际上不会将sl设置为任何内容。

这意味着(例如),如果第一个元素是最小的,s将被设置为某个任意值,并且尝试使用它索引数组可能会有问题。

要解决此问题,设置smalllarge的位置,您还应设置:

s = 0;
l = n - 1;

此外,您的交换代码错误,应该是:

temp = a[s];
a[s] = a[l];
a[l] = temp;

答案 1 :(得分:2)

您应该将sl初始化为某个值,因为当if条件不起作用时,它们的值将保持未初始化的垃圾值。因此,a[l]a[s]将不起作用,因为这些索引是未定义的值。这就是为什么你会得到segmentation fault,因为你正在访问数组的未定义区域。

因此,使用s=0,l=0等数组范围内的随机值来初始化变量,或者添加一些标志来检查条件是否正常。

if (l != 0 && s != 0) {
    temp=a[s];
    a[s]=a[l];
    a[l]=a[s];
}

另外,我认为您在最后一行a[l]=temp而不是a[l]=a[s]中交换值。

ideone link

答案 2 :(得分:0)

您不能基于动态大小声明数组,除非编译器支持它,即使它通常不可移植。

int a [n]

你实际上需要使用malloc或calloc。

int * a;

a =(int *)malloc(n * sizeof(int));或a =(int *)calloc(n,sizeof(int));