#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语句来找出错误的位置。 但是没有执行任何打印语句。这里的错误是什么?
答案 0 :(得分:5)
一个问题是,除非您发现的元素小于/大于当前元素,否则您实际上不会将s
和l
设置为任何内容。
这意味着(例如),如果第一个元素是最小的,s
将被设置为某个任意值,并且尝试使用它索引数组可能会有问题。
要解决此问题,设置small
和large
的位置,您还应设置:
s = 0;
l = n - 1;
此外,您的交换代码错误,应该是:
temp = a[s];
a[s] = a[l];
a[l] = temp;
答案 1 :(得分:2)
您应该将s
和l
初始化为某个值,因为当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]
中交换值。
答案 2 :(得分:0)
您不能基于动态大小声明数组,除非编译器支持它,即使它通常不可移植。
int a [n]
你实际上需要使用malloc或calloc。
int * a;
a =(int *)malloc(n * sizeof(int));或a =(int *)calloc(n,sizeof(int));