C表示循环分段故障

当我尝试在gcc上编译此代码时,我收到了分段错误错误。

#include  #include  #define N_TIMES 600000 #define ARRAY_SIZE 10000 int main (void) { double *array = calloc(ARRAY_SIZE, sizeof(double)); double sum = 0; int i; double sum1 = 0; for (i = 0; i < N_TIMES; i++) { int j; for (j = 0; j < ARRAY_SIZE; j += 20) { sum += array[j] + array[j+1] + array[j+2] + array[j+3] + array[j+4] + array[j+5] + array[j+6] + array[j+7] + array[j+8] + array[j+9]; sum += array[j+10] + array[j+11] + array[j+12] + array[j+13] + array[j+14] + array[j+15] + array[j+16] + array[j+17] + array[j+18] + array[j+19]; } } sum += sum1; return 0; } 

我正试图尽可能地加速for循环,所以我正在尝试疯狂的事情。 如何摆脱分段错误? 我还应该尝试不同的优化方法吗?

所以你原来的问题是由于你在内部循环中使用i而不是j在你的数组索引中而且由于N_TIMESARRAY_SIZE你最终会溢出你的数组边界,这是未定义的行为。

更正的代码仍有一个明显的问题:

 sum += array[ARRAY_SIZE]; 

array的有效索引将从0 to ARRAY_SIZE-1因此访问元素ARRAY_SIZE通过超出数组边界来调用未定义的行为。

  1. 编译器几乎肯定会比你更好地优化。 不要试图超越编译器。

  2. 问题几乎肯定是sum += array[ARRAY_SIZE]; C中的数组索引从0变为size-1,所以在这里你可能会“一个接一个”