回答編集履歴

1

微修正

2022/09/01 22:21

投稿

thkana
thkana

スコア7652

test CHANGED
@@ -10,6 +10,7 @@
10
10
  `pathbuf->ptr = malloc(INITLEN);`は、malloc()によって大きさINITLENのユーザーが好きに使って良い領域を(何らかの正当な方法で、誰かから)「借り」てその領域のアドレスをpathbuf->ptrに記憶します。
11
11
  続いておこなう`pathbuf->ptr = "abc"`は、メモリのどこかに"abc"というデータを持った領域を作成し(あるいは作成しておき)、その領域のアドレスをpathbuf->ptrに上書きします(それまでに入っていたデータは失われます)。
12
12
  さて借りた領域のアドレスはわからなくなってしまいました。借りたものは返さなければいけないのですが...小さなサイズだからしらばっくれるとか、OSがある場合は破産(プログラムが終了)したら勝手に回収される「はずだから」放置、というのはよいお作法ではありません。
13
+
13
- お作法で言えば、malloc()ではメモリ領域を借りられたことを確認する、つまりmalloc()の返り値がNULLでない)ことを「必ず」確認するのお作法です。
14
+ お作法で言えば、malloc()ではメモリ領域を借りられたことを確認する、つまりmalloc()の返り値がNULLでない)ことを「必ず」確認するのお作法です。
14
15
 
15
16
  余談に近い話になりますが、Segmentation faultになるのはC/C++の仕事ではなく、OSの仕事です。Cのレベルでは、定数領域に書き込む行為は「未定義」(結果の保証はなにもしない)というだけ。現実としてはシステムによって「何事もなかったかのように書き換えられる」「書き込み操作は行われるがデータは変化しない」「(今回のように)OS等がちょっかいをかけてくる」などの結果が考えられますが、それはC言語の範囲で決まるものではありません。