为什么这会变为负值
Why is this variably turning negative?
所以我的错误表明我没有访问此内存的权限。这是它的代码,我正在努力让collaz系列工作。但我的n
正在变得消极,尽管它不应该。
const int number = 1000000;
//Chain Vars-------------------
int chainLength = 0;
int startingNumber = 0;
int chain = 0;
int n = 0;
//----------------------------
for (int i = 2; i <= 1000000; i++)
{
n = i;
chain = 0;
while (n != 1 && n >= i)
{
chain++;
if ( (n % 2) == 0)
{
n = n / 2;
}
else
{
n = n * 3 + 1;
}
}
}
在for
循环中,您可以执行:
for (int i = 2; i <= 1000000; i++)
{
n = i;
chain = 0;
while (n != 1 && n >= i)
{
chain++;
if ( (n % 2) == 0)
{
n = n / 2;
}
else
{
n = n * 3 + 1;
}
}
//Store the chain length in cache
cache[i] = chain + cache[n];
//-------------------------------
if (cache[i] > chainLength)
{
chainLength = cache[i];
startingNumber = i;
}
}
在某个点上,while (n != 1 && n >= i)
最有可能以n
大于1000000
而结束。然后,您将越界(即[0:1000000]
)访问cache
(当您执行cache[n]
时)。
在while
循环之前添加std::cout << "i is " << i << std::endl;
。添加CCD_ 11之后。运行程序,你会得到(几秒钟后):
...
i is 113381
n is 85036
i is 113382
n is 56691
i is 113383
n is -1812855948
Erreur de segmentation (core dumped)
给你。现在,您可以使用调试器,识别错误,修复错误(很可能是返工循环),并使其工作!;-)
提示:当n
变为负值时,可能达到了int
的最大值。。。然后简单地使用bug类型(如long long int
或uint64_t)。然后,您很可能不会得到任何重载(除非您使number
成为bug)。
C#不像C++那样管理内存。如果访问数组超出了这里的范围,您可能不会出错(或者,正如上面所评论的,您只是运气好)。我不熟悉C#。必须始终避免访问阵列—它可能具有未确定的行为(可能或不可能导致崩溃)。
就像jpo38说的:
提示:当n变为负数时,它可能达到了int的最大值。。。在while循环之前,只需使用调试器验证即可:
这就是我的问题,然后我把"int n"改为"long-longn",因为"long-leng n"仍然很小,现在它给了我正确的答案。谢谢大家:)很容易,但有时是你看不到的小事。
运行并调试程序后:
//Store the chain length in cache
cache[i] = chain + cache[n];
n
似乎是0x93f20374
(在i
处为113383
),其为负-1812855948
,或者将是正2482111348
-但溢出变为-1812855948
。
while (n != 1 && n >= i)
循环以负n
结束,导致cache[n]
崩溃。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 为什么在全局范围内使用"extern int a"似乎不行?
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 为什么会发生堆损坏
- 为什么使用 "this" 指针调用派生成员函数?
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么比较运算符如此快速
- 为什么 Serial.println(<char[]>);返回随机字符?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 为什么不;名字在地图上是按顺序排列的吗
- 我的字符计数代码计算错误.为什么
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 为什么 std::unique 不调用 std::sort?
- 既然存在危险,为什么项目要使用-I include开关
- 为什么在运行时没有向我们提供有关分段错误的更多信息?