2 qq 28505783 qq_28505783 于 2016.05.09 21:43 提问

为何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();
}图片

3个回答

qq423399099
qq423399099   Ds   Rxr 2016.05.09 22:11
已采纳

有两个问题:
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();

}

图片说明

qq_28505783
qq_28505783 大神。看来以后我要细心了
一年多之前 回复
caozhy
caozhy   Ds   Rxr 2016.05.09 21:50

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

qq_28505783
qq_28505783 还不行。那个不用cha()来计算长度。直接用同字符串指针之间的相减,就可以得出指针走了几个字符。
一年多之前 回复
CSDNXIAOD
CSDNXIAOD   2016.05.09 21:52

读取位置 0x00000028 时发生访问冲突该怎么解决
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!