>>305
まったくの仮定の話ですが、

mallocが内部的に使ってる基本ブロックが、たとえば
union malloc_unit {
    struct {
        unsigned long block_size;
        void* next;
    };

    unsigned char a[32];
};

だとすれば、共用体 malloc_unit ひとつあたりのサイズは 32バイトなので、
malloc関数に指定した確保サイズが1バイトだとしても、実際には32バイト確保されてしまうのだろうから、
すくなくともp[1] から p[31]までは、なにを書いても平気(mallocの動作には支障ない)ような気がします。

もしも malloc が内部的に使ってる基本ブロックサイズが、たとえば
union malloc_unit {
    struct {
        unsigned char block_size;
        unsigned char next_address;
    };

    unsigned char a[1];
};

だとしたら、malloc_unit ひとつあたりのサイズは2バイトなので、p[3] は、次のブロックの next_address あたりを指すことになるでしょうし(まったくの仮定の話です)、mallocの動作に問題が生じるはずだと思います。
基本ブロックのサイズ次第だと思います。(そもそも、基本ブロックなんてものが本当に使われてるかどうかもわかりません。まったくの仮定の話です。もしかしたら別テーブルがあるのかもしれませんし…)