我是C语言的新手,试图让用户输入的数组升序打印。我正在尝试使用选择排序。我的devcpp在接受第一个输入后崩溃,当我尝试在在线c编译器上运行它时,它给出了分段错误。有人可以告诉我为什么会在这里发生吗? TIA
#include<stdio.h>
void swap()
{
int *x, *y;
int temp = *x;
*x = *y;
*y = temp;
}
void ss(int A[], int n)
{
int i, j, min;
for(i=0; i<n-1;i++)
{
min = i;
for(j=i+1; j<n; j++)
{
if (A[j]< A[min])
{
min = j;
}
swap(&A[min], &A[i]);
}
}
}
void print(int A[], int n)
{
int i;
for(i=0; i<n; i++)
{
printf("%d",A[i]);
}
}
int main()
{
int A[4], i, n;
printf("Enter the elements");
scanf("%d", &A[i]);
n=4;
ss(A,n);
printf("Sorted array \n");
print(A,n);
return 0;
}
我希望用户按升序输入数组。
答案 0 :(得分:1)
您的swap()
函数没有参数,并且指针x
和y
没有指向。您的细分错误来自以下语句:
int temp = *x;
由于*x
没有确定的值,因此您没有为x
分配程序中任何现有值的地址,而是尝试在此处间接使用它。
相反,将参数放在交换函数中:
void swap(int* x, int* y)
{
int temp = *x;
*x = *y;
*y = temp;
}
然后在外部范围中,将堆栈地址上的适当的现有值传递给此swap
函数。
答案 1 :(得分:1)
嗯,这是一个错误的开始:
void swap()
{
int *x, *y;
int temp = *x;
*x = *y;
*y = temp;
}
这会在函数内创建两个带有任意值的全新 new 指针,然后尝试取消引用它们,这是行为未定义的问题。
由于要使用swap
传递两个指向swap(&A[min], &A[i])
函数的指针,因此您应该接收参数列表中的那些指针,以便可以对其进行操作:>
void swap(int *x, int *y) {
int temp = *x;
*x = *y;
*y = temp;
}
而且,尽管这不是错误,但您可能想要考虑使用比A
或ss
(例如dataArray
和{{ 1}})。
例如,如果您不得不在将来的十二个月内回来并对其进行修改,这将使您的代码更具可读性,因此可以维护。
您还需要在SelectionSort
函数中使用 loop 来获取四个值。目前,您只能获得一个索引,索引号为main
,这可能会导致您再次出现未定义的行为。
由于您已经在 other 两个函数中完成了类似的循环,因此我假设您可以在不提供代码的情况下完成此任务。
答案 2 :(得分:1)
伙伴有很多错误。我在下面列出了它们:
在main()
中,检查您如何接受用户的数组值。 i
是未定义的,您试图插入到A[i]
中而不使用for
循环或未定义i
。那就是您获得seg fault
的地方。
for(i = 0; i < 4; i++)
scanf("%d", &A[i]);
另一个错误是您定义swap()
函数的方式。由于您已将swap
函数称为swap(&A[min], &A[j]);
,即将地址作为参数传递,因此您的函数也需要具有指向这些地址的指针。
应该是这样的:void swap(int* x, int* y)
。
由于我们在上面第二点所做的更改,您需要删除此行==> int *x, *y;
,该行再次在swap函数中声明2个指针。
这是应该起作用的代码:
#include<stdio.h>
void swap(int* x, int* y)
{
int temp = *x;
*x = *y;
*y = temp;
}
void ss(int A[], int n)
{
int i, j, min;
for(i=0; i<n-1;i++)
{
min = i;
for(j=i+1; j<n; j++)
{
if (A[j]< A[min])
{
min = j;
}
swap(&A[min], &A[j]);
}
}
}
void print(int A[], int n)
{
int i;
for(i=0; i<n; i++)
{
printf("%d\t",A[i]);
}
}
int main()
{
int A[4], i, n;
printf("Enter the elements:\n");
for(i = 0; i < 4; i++)
scanf("%d", &A[i]);
n=4;
ss(A,n);
printf("Sorted array \n");
print(A,n);
return 0;
}
输出如下:
Enter the elements: 1 2 3 4 Sorted array 4 3 2 1