完成我的任务,更多细节请参见another question如果我用

arr[(i * 16) % arrLen] *= 2; // seg fault

VS
arr[i % arrLen] *= 2; // OK!

为什么?Full source见第31行为什么?我将数组的长度取模,这样就可以了?

最佳答案

查看您的完整来源:
你应该检查malloc的返回以确保你能够获得该内存
你应该释放记忆,你有漏洞
arr数组中的内存是未初始化的,您可以分配它,但不要将其设置为任何值,这样您(很可能)会得到一个很大的负数这可以通过memset(arr,0,arrLen);
但是arrLen是用一个malloc(arrLen * sizeof(int))创建的,所以你取消了你在那里的工作。。。
关于你的seg错误,正如其他人所说,你的数组溢出了您已经创建了一个int数组然后从0循环到reps(268435456),这是int的最大大小。当你试图将其乘以16时,就会溢出并产生负偏移量。
尝试将16乘以reps的初始化:

int reps = 256 * 1024 * 1024 * 16;

编译器应该发出一个警告,让您知道这一点:
warning: integer overflow in expression [-Woverflow]

关于c - 段错误:arr [(i * 16)%arrLen] vs arr [i%arrLen],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12600204/

10-11 23:07