【发布时间】:2017-06-01 14:58:39
【问题描述】:
我目前开始学习 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]);) 后,我对其进行了中断,分段错误在 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.
【问题讨论】:
-
本书不教授现代和标准的 C。
-
@Olaf 感谢您的评论。你知道一些电子书或教程吗?
-
该标准值得阅读。但是在某处有一个关于 SO 的书单。
标签: c for-loop segmentation-fault qsort kernighan-and-ritchie