我目前开始学习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
的未初始化条目,该条目作为自动变量,将具有随机值(指向随机存储器位置,该位置可能是无效的(未定义的行为))。