gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 00:56:43 24 4
gpt4 key购买 nike

我遇到了一个奇怪的问题。我有一个动态创建的二维数组 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com