访问函数中的数组访问冲突(函数内部)

时间:2013-12-11 22:09:26

标签: c access-violation

我正在尝试在Mastermind的最多5个猜测中实现一种猜测秘密的算法。这是一个课堂作业,总的来说,我对编程(轻描淡写)有些新意,所以请耐心等待我可能错过的任何明显的事情。注意:我唯一允许使用的库是<stdio.h>

首先是代码:

#include <stdio.h>

#define feeddef() \
    feed[0] = '0'; \
    feed[1] = ' '; \
    feed[2] = 'B'; \
    feed[3] = ' '; \
    feed[4] = '0'; \
    feed[5] = ' '; \
    feed[6] = 'C';

int secret[4];

void initSet(int (*gs)[4],int *gsGd,int *guess);
void goodGuess(int (*gs)[4],int *gsGd,char fb[20],int *guess);
void feedback(int *gues,char feed[20]);

void feedback(int *gues,char feed[20])
{
    int i,j,temp[4], temp2[4];
    feeddef();
    for(i=0;i<4;i++)
    {
        temp[i] = gues[i];
        temp2[i] = secret[i];
    }
    for(i = 0;i<4;i++)
        if(temp[i] == temp2[i])
        {
            feed[0]++;
            temp[i] = 7;
            temp2[i] = 8;
        }
    for(i=0;i<4;i++)
        for(j=0;j<4;j++)
            if(temp[i] == temp2[j])
            {
                feed[4]++;
                temp[i] = 9;
                temp2[j] = 10;
            }
}

void initSet(int (*gs)[4],int *gsGd,int *guess)
{
    int i;

    for(i=0;i<1296;i++)
    {
        gs[i][3] = i%6;
        gs[i][2] = (i/6)%6;
        gs[i][1] = ((i/6)/6)%6;
        gs[i][0] = (((i/6)/6)/6)%6;
    }
    for(i=0;i<4;i++)
        guess[i] = (i+2)/2;
}

void goodGuess(int (*gs)[4],int *gsGd,char fb[20],int *guess)
{
    int i,j,count[1296],max_count = 0,max_index;
    char fbck[1296][2];
    char feed[20];
    for(i=0;i<1296;i++)
    {
        printf("Guess #%d in set: ",i);
        feedback(gs[i],feed);
        if(feed[0] != fb[0] || feed[4] != fb[4])
        {
            printf("Not matching\n");
            gsGd[i] = 0;
        }
        fbck[i][0] = feed[0];
        fbck[i][1] = feed[4];
    }
    printf("minimax start---\n");
    for(i=0;i<1296;i++)
    {
        count[i] = 0;
        for(j=0;j<1296;j++)
        {
            if(gsGd[j] == 0)
                continue;
            else
            {
                if(fbck[i][0] != fbck[j][0] || fbck[i][1] != fbck[j][1])
                    count[i]++;
            }
        }
    }
    printf("---minimax end\n");
    for(i=0;i<1296;i++)
        printf("Index at %d cancels out %d indices.\n",i,count[i]);
    for(i=0;i<1296;i++)
    {
        if(max_count < count[i])
        {
            printf("New max at index: %d\n",i);
            max_count = count[i];
            max_index = i;
        }
    }
    printf("New guess is: ");
    for(i=0;i<1296;i++)
    {
        if(fbck[i][0] != fbck[max_index][0] || fbck[i][1] != fbck[max_index][1])
            gsGd[i] = 0;
    }
    for(i=0;i<4;i++)
    {
        guess[i] = gs[max_index][i];
        printf("%d",guess[i]);
    }
    printf("\n");
}

int main()
{
    int gs[1296][4],gsGd[1296],guess[4],i,count = 0;
    char fback[20];
    while(1)
    {
        for(i=0;i<4;i++)
            scanf("%d",&secret[i]);
        initSet(gs,gsGd,guess);
        do
        {
            count++;
            printf("Goodguess %d",count);

            feedback(guess,fback);
            goodGuess(gs,gsGd,fback,guess);
        }while(fback[0] != '4');
        printf("Solved in %d guesses\n",count);
    }
    return 0;
}

由于某种原因,在goodGuess函数的第二次迭代中,我在此行遇到了访问冲突错误:

if(fbck[i][0] != fbck[max_index][0] || fbck[i][1] != fbck[max_index][1])

错误:

First-chance exception at 0x012643a6 in Mastermind.exe: 0xC0000005: Access violation reading location 0x99b00cc0.
Unhandled exception at 0x012643a6 in Mastermind.exe: 0xC0000005: Access violation reading location 0x99b00cc0.

据我了解,0xC0000005接近null意味着它可能正在尝试访问null,但我不知道是什么导致它。第一次结束时效果很好。

我有一种感觉,我错过了一些重要的东西,但如果我知道它是什么,我会被诅咒。

2 个答案:

答案 0 :(得分:1)

我的猜测是max_index未初始化。

创建max_index时,代码不会指定值。您只在if语句中指定一个值。所以在第一次迭代中,if语句找到一个true,你得到一个max_index的值。在第二次迭代中,它找不到true,而max_index是未初始化的。

在这样的情况下我建议一件事 - 你有一个相当复杂的陈述。所以很高兴看到四者中的哪一个失败了。所以只创建四个小做任何语句 - 例如if(fbck [i] [0] == 1)printf(“hi”)。

这可以让你缩小到该语句的哪一部分失败。它还有助于在运行中打印出每个变量的值 - 然后你可以运行代码,查看打印的最后一行,你将能够看到我和max_index是什么,这应该是一个巨大的线索关于发生了什么。

当您了解有关调试器和条件断点的更多信息时,您会找到比打印变量更好的方法!

答案 1 :(得分:0)

if(fbck[i][0] != fbck[max_index][0] || fbck[i][1] != fbck[max_index][1])

max_index可以在上面的表达式中使用未初始化。