私は自分の質問に対する答えを自分で見つけました:)
私が理解していなかったのは、glibc が Segfault と破損した二重リンク リストをどのように区別できるかということでした。私の理解によれば、glibc の観点からは、それらは同じもののように見えるはずだからです。プログラム内に二重連結リストを実装した場合、glibc はこれが他の構造体ではなく二重連結リストであることをどうやって知ることができるのでしょうか? おそらくできないので、それが私が混乱した理由です。
今、glibc のコード内の malloc/malloc.c を調べたところ、次のように表示されます。
1543 /* Take a chunk off a bin list */
1544 #define unlink(P, BK, FD) { \
1545 FD = P->fd; \
1546 BK = P->bk; \
1547 if (__builtin_expect (FD->bk != P || BK->fd != P, 0)) \
1548 malloc_printerr (check_action, "corrupted double-linked list", P); \
1549 else { \
1550 FD->bk = BK; \
1551 BK->fd = FD; \
だから今、これは突然理にかなっています。glibc がこれが二重リンクされたリストであることを認識できる理由は、リストが glibc 自体の一部であるためです。glibc は何らかのプログラミングが二重リンク リストを作成していることを何らかの方法で検出できると思っていたので、私は混乱していました。しかし、それが話しているこの二重連結リストが glibc 自体の一部である場合、もちろん、それが二重連結リストであることを知ることができます。
何がこのエラーを引き起こしたのか、まだわかりません。しかし、少なくとも、破損した二重リンクリストと Segfault の違いと、glibc がこの構造体が二重リンクリストであることをどのように認識できるかを理解しています:)