访问冲突读取位置0xFDFDFDFD

时间:2016-12-17 13:19:58

标签: c++ segmentation-fault access-violation

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

  

在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);
}

问题来自定义功能,程序启动但是当我尝试继续时它只是一次又一次出现。

1 个答案:

答案 0 :(得分:1)

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

索引&#34;工作&#34;取决于C语言的这个怪癖:

With arrays, why is it the case that 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;
}

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

此外,如果该功能有效,则必须在direction中收集返回的main值。否则更新将丢失。

如果您打算将其作为C ++,可以tabstd::vector<std::vector<int>>以避免大部分问题。