質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
Security+

Security+は、IT業界団体であるCompTIA認定の資格の一つです。ネットワークセキュリティやコンプライアンスと運用セキュリティといったセキュリティ分野における知識・技術の証明になり、セキュリティインシデントに対応するための知識も評価されます。

Q&A

解決済

ヒープとスタックの使い分けについて

hagitro
hagitro

総合スコア21

Security+

Security+は、IT業界団体であるCompTIA認定の資格の一つです。ネットワークセキュリティやコンプライアンスと運用セキュリティといったセキュリティ分野における知識・技術の証明になり、セキュリティインシデントに対応するための知識も評価されます。

3回答

0グッド

0クリップ

2388閲覧

投稿2018/10/17 03:03

ヒープとスタックは、プログラム上に実装するにあたって、どう使い分けるのでしょうか。
(どちらか片方だけで構成されたプログラムはプログラムとして成立するのでしょうか。)

※当方はプログラマではありませんので、界隈の常識が理解出来ていません。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

otn

2018/10/17 03:26

何を実装するのでしょうか?ヒープやスタックを実装する話でしょうか?そうすると「使い分け」が意味をなさないのですが?あるいは、すでにあるヒープやスタックを使って何かを実装する話でしょうか?であれば「使い分け」が意味を持ちますが。
hagitro

2018/10/17 04:03

otnさん、回答ありがとうございます。何を実装するか→何らかのプログラムを実装する話です。どんな用途のプログラムか→どんな用途のプログラムのときにヒープ(スタック)を使うのか、が根本の質問です。
otn

2018/10/17 05:44

では、「何らかのプログラムを作成する際に、ヒープとスタックは、どう使い分けるのでしょうか。」が意味の通った質問になります。
hagitro

2018/10/23 01:09

otnさん、ありがとうございます。おっしゃる通り、そういった理屈が理解出来ていない前提があるため、予め質問文にもコメント書きを入れております。

回答3

1

ベストアンサー

言語にも依るので、Cを想定して回答します。

スタック上の変数は、関数に入ったときに有効になり(作成され)、関数から出るときに、変数の存在が消えてしまいます(削除される)。

ヒープ上の変数は、プログラマが明示的に作成して、Cの場合だとプログラマが明示的に廃棄(削除)します。用済みになったのに廃棄し忘れるのが、「メモリリーク」というやつです。

なので、これらの性質を知った上で使い分けます。

これ以外に、グローバル変数(Cだとstatic変数も)があり、これはプログラムの実行開始時点で誕生して、プログラムの実行中はずっと存在し、プログラム終了と共に消えます。途中で削除は出来ません。

投稿2018/10/18 00:32

otn

総合スコア80489

pepperleaf👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

hagitro

2018/10/23 01:11

ありがとうございます。とても良くわかりました。これぞ欲しかった回答です。

0

確かに質問が意味不明って気もしますが、、、。

ヒープは、明示的に確保し、関数(メソッド)とかを抜けても有効。
スタックは、関数を抜ける時に開放されます。
それを理解して使うもの。

スタックだけでもプログラムは、作れますが、それが良いかどうかは状況次第。
スタックを使わないと言うのは、(今時のコンパイラでは)関数呼出しができないで可能かどうか? (関数を呼び出す際に、スタックに戻りアドレスが保存されます)

投稿2018/10/17 13:33

pepperleaf

総合スコア6379

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

hagitro

2018/10/23 01:15

pepperleafさん、ご回答ありがとうございます。 素人発想で恐縮ですが、ヒープを使う過程でスタックに一度データが入ったりするのでしょうか?

0

いまいち質門が意味不明ですが、
とりあえず、C言語の場合は、
ローカル変数はスタックに取られます。
グローバル変数やmalloc系の関数で確保されるメモリはヒープから取られますね

投稿2018/10/17 10:34

y_waiwai

総合スコア86064

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

2018/10/18 01:25

こちらの回答が他のユーザーから「過去の低評価」という指摘を受けました。

回答へのコメント

hagitro

2018/10/23 01:18

y_waiwaiさん、ご回答ありがとうございます。 見たところローカル変数は使い物にならない低機能さを感じるのですが、プログラマの方は、主にグローバル関数ベースでプログラミングされることが多いのでしょうか。
y_waiwai

2018/10/23 01:24

ローカル変数は定義した関数内だけで使える変数です まあ、低機能に見えるでしょうけど、実際はグローバル変数より遥かに多くのローカル変数が使用されます 主に、ローカル変数ベースでプログラミングされます
hagitro

2018/11/13 00:10

>主に、ローカル変数ベースでプログラミングされます 勉強になりました。ありがとうございます!

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Security+

Security+は、IT業界団体であるCompTIA認定の資格の一つです。ネットワークセキュリティやコンプライアンスと運用セキュリティといったセキュリティ分野における知識・技術の証明になり、セキュリティインシデントに対応するための知識も評価されます。