请求帮助。c语言强转换

#请大佬帮助!
###这样一个程序,然后它输出是越过了四个然后输出。为什么呢?

#include<stdio.h>
int main()
{
    char *p="abcdefgh",*r;
    long *q;
    q=(long*)p;
    q++;
    r=(char*)q;
    printf("%s\n",r);
    return 0;
}

希望有大佬可以回答一下。本人初学c,还不大清楚
这类型转换还可以这样玩的。

因为c语言并没有类型检查和下标越界的检查,所以的确可以这么写,不同的编译器long有几位不一定。
如果是4位,那么它可以得到e,否则得到\0,不同编译器结果不同。