回答編集履歴
1
微修正
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言語の範囲で決まるものではありません。
|