【发布时间】:2020-01-09 15:30:16
【问题描述】:
我已经编写了对整数数组进行快速排序的代码,但是在打印时它会在终端上显示某种内存地址。想了很久,还是没有成功。
我尝试在在线 gdb 编译器上编译它,它给出了一个错误:Segmentation Fault(core dumped),否则我尝试修改代码几次
#include<stdio.h>
void swap(int* a, int* b){
int t = *a;
*a = *b;
*b = t;
}
int part(int arr[], int l, int r){ //for partioning the array
int i=l, j=0;
while(j<r){
if(arr[j]<arr[r]){
swap(&arr[j], &arr[i]);
i++;
}
j++;
}
swap(&arr[i], &arr[r]);
return i;
}
void qsort(int arr[], int l, int r){ //recursive function for quicksort
if(l<r){
int p = part(arr, l, r);
qsort(arr, l, p-1);
qsort(arr, p+1, r);
}
}
int main(void){
int arr[] = {4, 10, 17, 5, 5, 6, 1 , 3, 0};
qsort(arr, 0, 8); //function called
for(int i=0; i<9; i++){
printf("%d ", arr[i]); //for printing the array
}
return 0;
}
实际结果:11016472 1974520423 11016472 6356864 6 6356800 4214784 11015616 1974521024
我期待数组被排序。
【问题讨论】:
-
qsort是标准库函数的名称,自己定义的行为不是C标准定义的。重命名并重试。 -
当我在我的机器上运行它时,它会输出
10 17 6 5 3 0 4 5 1。没有完全排序,但它仍然是数组的原始值。 -
@Eric Posypischil 试过了,还是不行。
-
@scatter 是的,有几次我也得到了原始值。
-
@thebusybee: C 2018 7.1.3 表示标准库的标识符是保留的,而 7.1.4 表示将它们定义为明确允许之外的行为具有标准未定义的行为:“如果程序在保留标识符的上下文中声明或定义标识符(7.1.4 允许的除外),或将保留标识符定义为宏名称,则行为未定义。”
标签: c algorithm sorting segmentation-fault quicksort