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

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

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

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

Q&A

解決済

3回答

2913閲覧

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

hagitro

総合スコア21

Security+

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

0グッド

0クリップ

投稿2018/10/17 03:03

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

回答3

0

ベストアンサー

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

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

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

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

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

投稿2018/10/18 00:32

otn

総合スコア84557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hagitro

2018/10/23 01:11

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

0

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

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

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

投稿2018/10/17 13:33

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hagitro

2018/10/23 01:15

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

0

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

投稿2018/10/17 10:34

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hagitro

2018/10/23 01:18

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

2018/10/23 01:24

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

2018/11/13 00:10

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問