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

Siv*_*bbu 1 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;
  }
Run Code Online (Sandbox Code Playgroud)

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

pax*_*blo 5

一个问题是,你不实际设置sl任何东西,除非你发现小/比当前更大的元素.

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

为了解决这个问题,在哪里设置smalllarge,你还应该设置:

s = 0;
l = n - 1;
Run Code Online (Sandbox Code Playgroud)

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

temp = a[s];
a[s] = a[l];
a[l] = temp;
Run Code Online (Sandbox Code Playgroud)