c - 在指针数组的 qsort 实现中使用 FOR 循环但不使用 WHILE 时出现段错误

标签 c for-loop segmentation-fault qsort kernighan-and-ritchie

我目前正在开始 C 编程,我的长期目标是自学逆向工程,并且我正在阅读 Denis M. Ritchie 的优秀书籍。尽管这本书写于 90 年代,但我还是选择了这本书,因为作者非常注意书中的解释和示例。 不管怎样,我在玩作者在 5.6 节中描述的快速排序算法,并试图通过记忆重写它,但由于我试图用 gdb 调试的段错误而遇到了麻烦。代码是:

#include <stdio.h>
#define MAX 10000

void sort(int **, int, int);

int main(){
    int tab[MAX]={18,7,43,72,2365,743,234,3215,13,456}, i;
    int *ptrtab[MAX];
    for (i=0; i<MAX && tab[i]>0; i++){
        ptrtab[i]=&tab[i];
    }   
    sort(ptrtab, 0, i-1);
    for (;i>0;i--) printf ("%d\n",*ptrtab[i]);
    return 0;
}

void sort(int **ptrtab,int gauche,int droite){
    int i, dernier;
    void echanger(int **, int, int);
    if (gauche>=droite) return;
    dernier=gauche;
    for (i=gauche+1; i<=droite; i++){
        if (*ptrtab[i]< *ptrtab[gauche])
            echanger(ptrtab, ++dernier, i);
    }
    echanger(ptrtab, gauche, dernier);
    sort(ptrtab,dernier+1,droite);
    sort(ptrtab,gauche, dernier);
}

void echanger(int **ptrtab,int a,int b){
    int *temp=ptrtab[a];
    ptrtab[a]=ptrtab[b];
    ptrtab[b]=temp;
}

长话短说,在确定原因行后 (for (;i>0;i--) printf ("%d\n",*ptrtab[i]);)I中断它,段错误使程序在 for 循环的第一次迭代中崩溃,并且 printf 没有被执行。所以我只是在代码中更改了这一行,改为放置一个 while 循环:

#include <stdio.h>
#define MAX 10000

void sort(int **, int, int);

int main(){
    int tab[MAX]={18,7,43,72,2365,743,234,3215,13,456}, i;
    int *ptrtab[MAX];
    for (i=0; i<MAX && tab[i]>0; i++){
        ptrtab[i]=&tab[i];
    }   
    sort(ptrtab, 0, i-1);
    while (i>0) printf ("%d\n",*ptrtab[--i]);
    return 0;
}

void sort(int **ptrtab,int gauche,int droite){
    int i, dernier;
    void echanger(int **, int, int);
    if (gauche>=droite) return;
    dernier=gauche;
    for (i=gauche+1; i<=droite; i++){
        if (*ptrtab[i]< *ptrtab[gauche])
            echanger(ptrtab, ++dernier, i);
    }
    echanger(ptrtab, gauche, dernier);
    sort(ptrtab,dernier+1,droite);
    sort(ptrtab,gauche, dernier);
}

void echanger(int **ptrtab,int a,int b){
    int *temp=ptrtab[a];
    ptrtab[a]=ptrtab[b];
    ptrtab[b]=temp;
}

现在这段代码可以工作了。 我知道我的代码中肯定有很多错误,因为我只是一个初学者,但我无法理解为什么从 for 更改为 while 循环的原因有所作为... 请注意,我在 ubuntu 16.04 上使用 GCC。

感谢大家的关注,抱歉啰嗦。 亲切的问候, S.A.

最佳答案

您的 while 循环实际上与 for 循环不同。 while 循环在使用它之前递减; for 循环没有。

关于c - 在指针数组的 qsort 实现中使用 FOR 循环但不使用 WHILE 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41698963/

相关文章:

C,尽管有互斥锁,但在循环中初始化的 pthreads 没有正确执行分配的函数

编译器看不到第二个 for 循环

c++ - 段错误 Netbeans 7.1 C++

c - MexFile 导致 "Assertion detected"错误 - mexfiles 中的 memcpy 有问题吗?

c - 创建AVL树时访问冲突异常

c - 寻找数组中最大的子列表?

读取循环时的 Shell 脚本仅执行一次

python - 清理笨重的 for 循环

c - 尝试读取段错误,直到在 C 中遇到 header

检查用户输入是否在特定限制之间,如果在输入正确的输入之前不再询问