人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

C言語のK&Rで簡易スタックを実装するサンプルコードが載っていたのですが、これの使い方を教えてください。
https://gist.github.com/DQNEO/5413292

afreeにアドレスを渡してメモリ解放してもらう仕組みになっているのですが、これだと使う側がスタックに積んだ各要素の先頭アドレスを記憶・管理しなきゃいけないので、allocとafreeだけではスタックを実現できないのではないかと思ったのです。

スタックに積んだ要素のアドレスを配列に入れておけばできそうな気がしますが、やはりそうするしかないのでしょうか・・・。(配列でスタックを作ったら意味がないよなーという気がしました)


●質問者: DQNEO
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● しおり
●34ポイント
void afree(char *p)
{
 if (p >= allocbuf && p < allocbuf + ALLOCSIZE) {
 allocp = p;
 }
}

の写し間違いだと思いますが、要するにalloc()した順とは逆にafree()しなければならないという所が「簡易」なのでしょう。


DQNEOさんのコメント
不等号間違っていました。ご指摘ありがとうございます。 1回alloc()して1回afree()するなら簡単なのですが、N回alloc()してN回afree()しようとすると極度に難易度が高くなり、どうやって実装するのかと質問を立てた次第です。

2 ● quintia
●33ポイント

K&Rが手元にないので確認できないですが、このソースだけを見る限りでは、これは「スタック」の簡易な実装ではなくて、「スタックを使ったメモリ割り当て」の簡易な実装なんじゃないでしょうか?

alloc,afreeは、スタックへの操作であるpush,popとして使うものじゃなくて、malloc,freeの代替として使うものではないかと。
もちろん実験的/簡易的な実装であってかわりに使えるようなものではないので、つまりこれは「(malloc,free がヒープによるメモリ割り当てであるのに対して)スタックによるメモリ割り当てはこんな感じになりますよ」という説明なんだと思います。


DQNEOさんのコメント
> 「スタック」の簡易な実装ではなくて、「スタックを使ったメモリ割り当て」の簡易な実装なんじゃないでしょうか? なるほどそうかもしれません。 ただ、K&Rにはあの関数でlast-in first-outのstackが実現できると書いてあるので、どうやってやるのだろう?と思ったのです。

質問者から

一応補足ですが、質問は「使い方を教えてください。」です。


3 ● fhtdd
●33ポイント

http://homepage3.nifty.com/mmgames/c_guide/c_kandr.html
こちらを参考にしてみては?

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ