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



我目前开始学习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 ("%dn",*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 ("%dn",*ptrtab[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 ("%dn",*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循环在使用它之前递减i;for循环没有。

In:

for (;i>0;i--) printf ("%dn",*ptrtab[i]);

循环从上一个循环的i的最后一个值开始,在那里它到达数组的末尾(因此i将是MAX),或者在tab为零的点对其进行索引。

在第一种情况下,ptrtab[MAX]将被索引,这是无效的,在第二种情况下将使用ptrtab的未初始化条目,该条目作为自动变量,将具有随机值(指向随机存储器位置,该位置可能是无效的(未定义的行为))。

相关内容

最新更新