我想获得一些帮助,我在运行应用程序时会遇到此错误
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>>
以避免大多数此类问题。