为何c语言中会出现读取位置时发生访问冲突

我是写字符串检索。但是如果把jiansuo()这个函数中第二个if(cha(p2)==(p3-p2+1))的话就没问题了。也就是说后边不能==i,如果是i的话,就出错~~

#include
int cha(char *p1)
{
int num=0;
for (char *p = p1; *p!= '\0'; p++)
{
num++;
}
return num;
}
void jiansuo(char *p1,char *p2)
{
for (char *p = p1; p<(p+cha(p1)-cha(p2)); p++)
{
int i = 0;
for (char *p3 = p2; *p3 != '\0'; p3++,i++)
{
if (*p3 != *(p+(p3-p2)))
{
break;
}
if (cha(p2)== i)
{
printf("找到了!在第%d个",p-p1+1);
return;
}
}
}
printf("没找到\n");
}
void main()
{
char *o = "tiandiwuji";
char *a = "diwu";
jiansuo(o,a);
getchar();
}图片

有两个问题:
1.for (char *p = p1; p<(p+cha(p1)-cha(p2)); p++)应该改成for (char *p = p1; p<(p1+cha(p1)-cha(p2)); p++)
不然的话p<(p+cha(p1)-cha(p2))相当于p<p+6肯定恒满足啊,直到越界崩溃
2.if (cha(p2)== i )改成if (cha(p2)== i + 1)因为i++是在当次for循环之后才执行的,只要之前没有break说明当前字符是相等的

 #include <stdio.h>
#include <string.h>
int cha(char *p1)
{
    int num=0;
    for (char *p = p1; *p!= '\0'; p++)
    {
        num++;
    }
    return num;
}
void jiansuo(char *p1,char *p2)
{
    for (char *p = p1; p<(p1+cha(p1)-cha(p2)); p++)
    {
        int i = 0;
        for (char *p3 = p2; *p3 != '\0'; p3++,i++)
        {
            if (*p3 != *(p+(p3-p2)))
            {
                break;
            }
            if (cha(p2)== i + 1)
            {
                printf("找到了!在第%d个",p-p1+1);
                return;
            }
        }
    }
    printf("没找到\n");
}
void main()
{
    char *o = "tiandiwuji";
    char *a = "diwui";
    jiansuo(o,a);
    getchar();

}

图片说明

if (*p3 != *(p+(p3-p2)))
->
if (*p3 != *(p+(cha(p3)-cha(p2))))