c++ - 即使检查了两个索引的边界,动态二维数组也存在奇怪的访问冲突

标签 c++ arrays access-violation

我遇到了一个奇怪的问题。我有一个动态创建的二维数组 Content,它的高度为 _h,宽度为 _w(在我的实现中,行是第一个参数,列是第二个参数,在上下文中是有意义的)。两个索引可以越界,这是设计使然,如果是这样,那么索引将“环绕”数组:

Content[v.iget()%_h][u.iget()%_w];

v 和 u 是我自己的类的对象;它们内部有一个 __int64 值并且 iget() 是这样的:

return value>>precision;

它返回一个普通的 32 位整数。我用 % 按高度或宽度“包装”这个 int 值,显然余数总是 0 <= r < max。所以这个 % 操作也提供了一种保护,防止任何可能的越界情况,但我有时会在这条线上遇到访问冲突。当我查看 v 和 u 的值时,它们类似于 -7753978124 - 实际上,在我的上下文中不应该出现负数(所以我还没有寻找导致它的原因),但无论如何,. iget() 应该把它变成一个正常的整数,%_h 或 %_w 应该把它放在边界内,但我却遇到了访问冲突。这怎么可能?

最佳答案

should turn it into a normal integer

没有。 (-1 % 2) == -1

so 表达式 x % max将返回 (-max..max) 范围内的值。

这是第一个问题。

第二个问题是这样的:

__int64 a = 0xffffffff00000000;
int b = a >> 32;
printf("%d\n", b);

0xffffffff00000000 >> 320xffffffff ,这是一个负数 -1 (对于带符号的 32 位整数,即)。

您可以使用如下表达式解决问题:

((x % width) + width)%width

或者你可以用 if/else 修复索引:

x %= width;
if (x < 0)
    x += width;

或者你可以让 iget() 返回 unsigned int但是对于所有不是 2 的幂的宽度和高度,这不会正确环绕负索引。

关于c++ - 即使检查了两个索引的边界,动态二维数组也存在奇怪的访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10843631/

相关文章:

c++ - STD 指向指针的迭代器;获取应该等效的代码的不同类型?

python - 从 Qt 小部件应用程序调用 pyqt 小部件

javascript - 在 javascript 中创建了我自己的 forEach 函数,但它返回未定义

java - 为什么我会收到 ArrayIndexOutOfBounds 异常?

c++ - 向 std::unordered_map 插入数据时发生访问冲突

python - boost dijkstra_shortest_paths : can't extract (or find? ) 路径(路径包含一个循环)

c++ - 使用 int 数组的一部分时的字节顺序

php - 使用 jQuery 将数据数组发送到服务器

C++ BWAPI异常访问冲突

C# P/Invoke on CUDA DLL 最终导致 AccessViolationException