访问违规读数位置0xfdfdfdfd



我想获得一些帮助,我在运行应用程序时会遇到此错误

consoleapplication1.exe中的0x0029b23d丢弃了例外:0xc0000005: 访问违规读数位置0xfdfdfdfd。如果有处理程序 对于此例外,可以安全地继续该程序。

我认为问题是访问非页码内存区域

这是我的代码

int ** create_tab(int size)
{
    int ** tab = new int *[size];
    for (int i = 0; i < size; i++)
    {
        tab[i] = new int[size];
    }
    return tab;
}
int definition(int direction, int px, int py, int tab)
{
    switch (tab[&py][&px]) {
    case 1:
        tab[&py][&px] = 0;
        direction = direction - 1;
        break;
    case 0:
        tab[&py][&px] = 1;
        direction = direction + 1;
        break;
    }
    return direction;
}
int main()
{
    int px = 0;
    int py = 0;
    int direction = 0;
    int size = 0;
    int steps = 0;
    int steps_done = 0;
    for (int steps_done = 0;steps_done < steps;steps_done++)
    {
        system("cls");
        turningaround(direction);
        moves(direction, px, py);
        looping_tab(px, py, size);
        definition(direction, px, py, ** tab);
        printing(size, ** tab);
}

问题来自定义函数,程序开始,但是当我尝试继续它时,就会一次又一次出现。

使用tab[&py][&px]恰好使编译器接受代码,但这只是完全错误。您不小心告诉编译器&py是一个数组,而 tab是索引,当它应该是相反的时候。

索引"作品"取决于C语言的这个怪癖:

使用数组,为什么a [5] == 5 [a]?

我想使用该功能的预期方法是

int definition(int direction, int px, int py, int** tab)
{
    switch (tab[py][px]) {
    case 1:
        tab[py][px] = 0;
        direction = direction - 1;
        break;
    case 0:
        tab[py][px] = 1;
        direction = direction + 1;
        break;
    }
    return direction;
}

但这也不起作用,因为编译器不知道矩阵中的行的长度。这取决于传递给create_tab函数的size参数,definition对此一无所知。

另外,如果该功能起作用,则必须在main中收集返回的direction值。否则更新将丢失。

如果您打算是C ,则可以使tab成为std::vector<std::vector<int>>以避免大多数此类问题。

相关内容

  • 没有找到相关文章

最新更新