01 | c语言非递归乘法表(帧栈理解)
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <stdbool.h> 4 5 typedef struct{ 6 int pc; //程序运行到了那一步 7 int line; // 8 }Frame; 9 10 Frame stk[128]; //全局的栈 11 Frame *top = stk - 1; //全局的栈指针 12 13 void call(int line) { 14 //static int num = 1; 15 // (*(++top)).pc = 0; 出现bug的地方,就在于++用的多了 16 // (*(++top)).line = line; 17 // (*(++top)).flag = flag; 18 19 *(++top) = (Frame){ 0,line }; //学习这个指针一开始指在-1的位置,之后变为0,注意结构体的构造 20 } 21 22 void ret() { 23 top--; 24 } 25 26 void pp(int line) { 27 28 call(line); //注意这里是第一个桢,接下来就要靠它来生成其他的帧栈 29 for (Frame *f; (f = top) >= stk; f->pc++) { 30 if (f->pc+1 == f->line) { 31 for (int i = 1; i <= f->line; i++) { 32 printf("%-2d* %-2d= %2d ", i, f->line, i*f->line); 33 } 34 printf("\n"); 35 ret(); //帧栈清理,事实是栈指针移动 36 } 37 //当相差为2的时候,这个时候才产生下一帧栈,若大于2的时候,为空语句,pc单纯增加 38 else if(f->pc+2==f->line){ 39 call(f->line - 1); 40 } 41 } 42 } 43 int main() { 44 pp(10); 45 system("pause"); 46 }