Cのmalloc領域のlifetimeやそれを差すpointerの有効期限というものを
LispなどのGC領域に変数を割り付ける言語のextentになぞらえて考えると
少し悩ましいんだけれど、参考までに以下のような疑似コードを書いてみた。
(Cは久しぶりなので、細部に変なとこあっても感じをくみ取ってちょ)
安直に領域のlifetime = pointer変数のextentとは言い難い

//#defien AS auto
#define AS static
func() {
SC void *p, *q、*r; // 静的lifetimeをもつpointer、初期値不定、初期値としてNULLを設定すると行儀良し

q = (void *) malloc(サイズ1); // 領域の割付け
// (中略)
p = q; // pointer p の値が 不定→ vlidに、これをあえてpのbindとみなすか?

// p[]に対し ここら辺で何かいろいろ処理

r = malloc(サイズ2); // 別の領域の割付け
// (中略)
p = r; // これをどうとらえる?bindの仕切りなおしとみなす?www
// p[]に対し 何かいろいろ処理

free(q);
// (中略)

free(r);

// pinter 変数 p はまだ存在するが指している領域はもう無効

} // block scopeから離脱、pがautoの場合ここで消滅する