C 中的冒泡排序显示分段错误
Bubble sort in C showing segmentation fault
我正在编写代码以使用冒泡排序对数组进行排序,但它显示了一个我无法解决的错误。代码:
#include<stdio.h>
void swap();
void bubbleSort();
void printArr();
void main()
{
int n, arr[20];
printf("\n Enter the number of elements: ");
scanf("%d",&n);
printf("\n Enter the elements: ");
for(int i = 0; i<= n-1; i++)
scanf("%d",&arr[n]);
bubbleSort(arr, n);
printArr(arr, n);
}
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void bubbleSort(int arr[], int size)
{
int a, b;
for(int i=0; i<=size-1; i++)
{
if(arr[a] > arr[b])
swap(arr[a],arr[b]);
}
}
void printArr(int arr[], int size)
{
int i;
printf("\n Sorted array: ");
for(i=0; i<=size-1; i++)
printf(" %d ", arr[i]);
}
当我编译文件时,它显示了两个这样的警告:
sort.c: 在函数‘bubbleSort’中:
sort.c:37:21:警告:传递‘swap’的参数 1 使指针来自整数而不进行强制转换 [-Wint-conversion]
swap(arr[a],arr[b]);
~~~^~~
sort.c:20:16: 注意:应为“int *”但参数类型为“int”
void swap(int *a, int *b)
~~~~~^
sort.c:37:28: 警告:传递“swap”的参数 2 使指针来自整数而不进行强制转换 [-Wint-conversion]
swap(arr[a],arr[b]);
~~~^~~
sort.c:20:24: 注意:应为“int *”但参数类型为“int”
void swap(int *a, int *b)
~~~~~^
当我是 运行 程序时,它正在接受输入,但之后显示 segmentation fault (core dumped)
感谢您的帮助。
swap()
函数接受指针,所以需要像swap(&arr[a], &arr[b]);
那样调用。
否则它会将 int
值作为内存地址(即指针 int*
)并尝试访问它们,这会导致分段错误,因为程序访问了其有效地址范围之外.
对于冒泡排序,它需要多次遍历数组,直到所有对的顺序正确。
变量 a
和 b
也未初始化。对于冒泡排序,它需要比较和交换 i
和 i+1
,对于 i
从 0
到 size-2
。
我正在编写代码以使用冒泡排序对数组进行排序,但它显示了一个我无法解决的错误。代码:
#include<stdio.h>
void swap();
void bubbleSort();
void printArr();
void main()
{
int n, arr[20];
printf("\n Enter the number of elements: ");
scanf("%d",&n);
printf("\n Enter the elements: ");
for(int i = 0; i<= n-1; i++)
scanf("%d",&arr[n]);
bubbleSort(arr, n);
printArr(arr, n);
}
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void bubbleSort(int arr[], int size)
{
int a, b;
for(int i=0; i<=size-1; i++)
{
if(arr[a] > arr[b])
swap(arr[a],arr[b]);
}
}
void printArr(int arr[], int size)
{
int i;
printf("\n Sorted array: ");
for(i=0; i<=size-1; i++)
printf(" %d ", arr[i]);
}
当我编译文件时,它显示了两个这样的警告:
sort.c: 在函数‘bubbleSort’中:
sort.c:37:21:警告:传递‘swap’的参数 1 使指针来自整数而不进行强制转换 [-Wint-conversion]
swap(arr[a],arr[b]);
~~~^~~
sort.c:20:16: 注意:应为“int *”但参数类型为“int”
void swap(int *a, int *b)
~~~~~^
sort.c:37:28: 警告:传递“swap”的参数 2 使指针来自整数而不进行强制转换 [-Wint-conversion]
swap(arr[a],arr[b]);
~~~^~~
sort.c:20:24: 注意:应为“int *”但参数类型为“int”
void swap(int *a, int *b)
~~~~~^
当我是 运行 程序时,它正在接受输入,但之后显示 segmentation fault (core dumped)
感谢您的帮助。
swap()
函数接受指针,所以需要像swap(&arr[a], &arr[b]);
那样调用。
否则它会将 int
值作为内存地址(即指针 int*
)并尝试访问它们,这会导致分段错误,因为程序访问了其有效地址范围之外.
对于冒泡排序,它需要多次遍历数组,直到所有对的顺序正确。
变量 a
和 b
也未初始化。对于冒泡排序,它需要比较和交换 i
和 i+1
,对于 i
从 0
到 size-2
。