質問するログイン新規登録

回答編集履歴

2

追記と修正

2021/07/09 08:16

投稿

BeatStar
BeatStar

スコア4962

answer CHANGED
@@ -1,9 +1,11 @@
1
1
  > 以下のような関数をmain関数から呼び出して、内部でcallocを使って変数aにメモリを割り当てた場合、この関数からリターンした後もaというローカル変数の値はプログラムの実行終了までメモリ上に存在し続けることが保障されるという認識であってますでしょうか?
2
2
 
3
- 保証はされません。
3
+ ~~保証はされません。あくまで「結果的に」あるだけです。~~
4
4
 
5
- あくまで「結果的に」あだけです。
5
+ 保証はされようです。
6
6
 
7
+ // ですが、あれを保証すると言うのかな……(まあ、確かに保証はしていますが……)
8
+
7
9
  まず、普通の変数や定数は**スタック領域に**確保されます。
8
10
 
9
11
  ですが、C言語でいうmalloc/free, C++でいうnew/delete でやる動的確保については、
@@ -25,9 +27,10 @@
25
27
  Token *tok;
26
28
  ```
27
29
 
28
- はあくまでToken構造体のオブジェクトでしかないです。
30
+ ~~はあくまでToken構造体のオブジェクトでしかないです。(近いニュアンスとしては『変数』か。厳密には違うけど)~~
29
- (近いニュアンスとしては『変数』か。厳密には違うけど)
30
31
 
32
+ ご指摘を受けて、よくよく考えると「ポインタ」なので、『Token構造体の(実体に対する)ポインタ』ですね。
33
+
31
34
  メンバっていうのは Token構造体の中にある int val とかです。
32
35
 
33
36
  > この時このnew_tokenという関数からreturnした後も、プログラムが終了するまで、この代入した値はメモリ上から失われないという認識は正しいでしょうか
@@ -50,4 +53,8 @@
50
53
  ポインタはあくまで「アドレス」です。
51
54
 
52
55
  メモリ上のどこに配置されているかのアドレスであって、実体ではないので、
53
- そのアドレスを辿っていけば使えるのです。
56
+ そのアドレスを辿っていけば使えるのです。
57
+
58
+ ----
59
+
60
+ ※ 他に低評価になりそうな理由があれば、挙げてほしいです。(後学のためにも)

1

追記1

2021/07/09 08:16

投稿

BeatStar
BeatStar

スコア4962

answer CHANGED
@@ -38,4 +38,16 @@
38
38
 
39
39
  結果的に存在しているだけです。
40
40
 
41
- ただし、質問にある、一番上のコードでは「他の関数からはアクセスできない」状態で居座っています。
41
+ ただし、質問にある、一番上のコードでは「他の関数からはアクセスできない」状態で居座っています。
42
+
43
+ ---------------
44
+
45
+ [追記1]
46
+
47
+ リスト構造や木構造のように、「次へのポインタ」とかを持っている場合はそこから辿ればいいので、
48
+ 使えます。
49
+
50
+ ポインタはあくまで「アドレス」です。
51
+
52
+ メモリ上のどこに配置されているかのアドレスであって、実体ではないので、
53
+ そのアドレスを辿っていけば使えるのです。