void afree(char *p) { if (p >= allocbuf && p < allocbuf + ALLOCSIZE) { allocp = p; } }
の写し間違いだと思いますが、要するにalloc()した順とは逆にafree()しなければならないという所が「簡易」なのでしょう。
K&Rが手元にないので確認できないですが、このソースだけを見る限りでは、これは「スタック」の簡易な実装ではなくて、「スタックを使ったメモリ割り当て」の簡易な実装なんじゃないでしょうか?
alloc,afreeは、スタックへの操作であるpush,popとして使うものじゃなくて、malloc,freeの代替として使うものではないかと。
もちろん実験的/簡易的な実装であってかわりに使えるようなものではないので、つまりこれは「(malloc,free がヒープによるメモリ割り当てであるのに対して)スタックによるメモリ割り当てはこんな感じになりますよ」という説明なんだと思います。
一応補足ですが、質問は「使い方を教えてください。」です。