我想得到一些帮助,我在运行应用程序时遇到此错误
在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);
}
问题来自定义功能,程序启动但是当我尝试继续时它只是一次又一次出现。
答案 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 ++,可以tab
为std::vector<std::vector<int>>
以避免大部分问题。