| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1369 人关注过本帖
标题:0x5F2DEB12(msvcr110.dll)中有未经处理的异常
取消只看楼主 加入收藏
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
结帖率:91.43%
收藏
已结贴  问题点数:20 回复次数:4 
0x5F2DEB12(msvcr110.dll)中有未经处理的异常
0x5F2DEB12(msvcr110.dll)中有未经处理的异常:0xC0000005:读取位置***时发生访问冲突。

写了一个处理数据的代码,对同一个数据文件进行处理,大概率(10次有7、8次)出现这个错误,小概率(10次里有2、3次)能出正确结果。

不明白是不是程序有问题。如果有问题为什么对同一个文件进行处理的时候又能出结果?
2017-04-10 11:03
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:0 
回复 2楼 吹水佬
没有用到动态分布资源,用的都是数组,但是指针来来回回比较多。
2017-04-10 11:43
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:0 
回复 4楼 邹特强
代码如下,因为是在局域网,只能手敲过来,数据也没法测试,还麻烦将就看看。

程序代码:
#define BUFSIZE 64
char * memstr(char *data_1, char *data_2, int len_1, int len_2);

int main()
{
    FILE *fp_list, *fpr, *fpw;
    int i, ret, pre, flag_data_now, flag_data_pre, flag_data_next, flag_temp;
    char Cmd[BUFSIZE], fname[BUFSIZ], Data[3][BUFSIZE], Data_temp[BUFSIZE*2];
    char *p_c_temp1, *p_c_temp2, *p_c_begin, *p_c_end;
    

    memset(Cmd, 0, sizeof(Cmd));
    memset(Data, 0, sizeof(Data));
    if((fp_list = fopen("pcap.lst", "r"))==NULL) return 0;

    while(1)
    {
        memset(fname, 0, sizeof(fname));
        if(fscanf(fp_list, "%s", fname)==EOF)
            break;

        if((fpr=fopen(fname, "rb"))==NULL)
            continue;

        sprintf(Cmd, "%s.new", fname);
        if((fpw = fopen(Cmd, "wb"))==NULL) 
        {
            fclose(fpr);
            continue;
        }

        flag_data_now = 0;
        ret = fread(Data[1], 1, BUFSIZE, fpr);
        pre = 0;
        p_c_temp2 = NULL;
        while(1)
        {
            if(ret < BUFSIZE)
                break;

            flag_data_now = (flag_data_now+1)%3;
            flag_data_next = (flag_data_now+1)%3;
            flag_data_pre = (flag_data_now+2)%3;
            ret = fread(Data[flag_data_next], 1, BUFSIZE, fpr);
            pre++;

            flag_temp = 0;
            p_c_temp1 = (char *)memchr(Data[flag_data_now],0xab,BUFSIZE);
            p_c_temp2 = Data[flag_data_now];
            while(p_c_temp1 != NULL)
            {
                if(p_c_temp1-p_c_temp2 > 1)
                {
                    fwrite(p_c_temp2, 1, p_c_temp1-p_c_temp2-1, fpw);
                    p_c_temp2 = p_c_temp1-1;
                }

                if(p_c_temp1 == Data[flag_data_now])
                {
                    if((pre==1) || (pre>1 && ((Data[flag_data_pre][BUFSIZE-1]&0xf0) != 0x10)))
                        fwrite(p_c_temp2, 1, p_c_temp1-p_c_temp2+1, fpw);
                }
                else
                {
                    if(((*(p_c_temp1-1))&0xf0) != 0x10)
                        fwrite(p_c_temp2, 1, p_c_temp1-p_c_temp2+1, fpw);
                    else
                    {
                        int temp = p_c_temp1-Data[flag_data_now];
                        if(temp>2 && temp<(BUFSIZE-2))
                            if(((*(p_c_temp1+2)&0xff)!=0xab) && ((*(p_c_temp1-2_&0xff)!=0xab))
                                fwrite(p_c_temp2, 1, p_c_temp1-p_c_temp2+1, fpw);
                    }
                }

                if(p_c_temp1 == &Data[flag_data_now][BUFSIZE-1])
                {
                    flag_temp++;
                    break;
                }
                else if(p_c_temp1 == &Data[flag_data_now][BUFSIZE-2])
                {
                    if(((Data[flag_data_now][BUFSIZE-1]&0xf0)!=0x10) || (Data[flag_data_next][0]&0xff!=0xab))
                        fwrite(p_c_temp1+1, 1, 1, fpw);
                    flag_temp++;
                    break;
                }

                p_c_temp2 = p_c_temp1+1;
                p_c_temp1 = (char *)memchr(p_c_temp2, 0xab, BUFSIZE-(p_c_temp1-Data[flag_data_now]) );

            }
            if(flag_temp==0)
                fwrite(p_c_temp2, 1, BUFSIZE-(p_c_temp2-Data[flag_data_now]), fpw);

        }
        fflush(fpw);
        fclose(fpr);
        fclose(fpw);
    }
    
    return 0;
}

char * memstr(char *data_1, char *data_2, int len_1, int len_2)
{
    int i,j,k=0;
    for(i=0; i<len_1-len_2; i++)
    {
        if(data_1[i]==data_2[0])
            for(j=0; j<len_2; j++)
                if(data_1[i+j]!=data_2[j])
                    break;
        if(j==len_2)
            return data_1+i;
    }
    return NULL;
}
2017-04-10 16:29
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:0 
回复 6楼 吹水佬
又看了一遍,目前还没看出问题。
但是我理解,对同一份数据进行处理,如果数组越界的话,出错的话应该是在同一个地方,但是出错的位置都是不一样的(也会有一样的),来回反复试,还有不出错直接出结果的。这个没想明白,不知道怎么定位错误。
2017-04-11 10:47
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:0 
回复 6楼 吹水佬
全删了重写了一遍,这次都过了。
应该是哪里有指针搞错了,但是实在找不出来。

不过还是不明白,既然指针有问题,对同样的数据进行调试的时候,不应该每次都在同一个地方出错吗?
2017-04-11 21:32
快速回复:0x5F2DEB12(msvcr110.dll)中有未经处理的异常
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.177017 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved