分段错误:arr [(i*16)%arrLen] vs arr [i%arrLen]

Jie*_*eng 1 c

处理我的任务,在另一个问题中处理更多细节.如果我使用

arr[(i * 16) % arrLen] *= 2; // seg fault
Run Code Online (Sandbox Code Playgroud)

VS

arr[i % arrLen] *= 2; // OK!
Run Code Online (Sandbox Code Playgroud)

为什么?完整来源见第31行.为什么?我模数组的长度,所以应该没问题?

Ale*_*nze 5

i * 16可以溢出到有符号整数的负范围内.当你取一个负整数的模数时,你可以得到一个负余数,这将使你的数组​​下标为负数,并导致在数组的已分配内存之外的访问,有时会导致崩溃.