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_TIMES
比ARRAY_SIZE
你最终会溢出你的数组边界,这是未定义的行为。
更正的代码仍有一个明显的问题:
sum += array[ARRAY_SIZE];
array
的有效索引将从0 to ARRAY_SIZE-1
因此访问元素ARRAY_SIZE
通过超出数组边界来调用未定义的行为。
-
编译器几乎肯定会比你更好地优化。 不要试图超越编译器。
-
问题几乎肯定是
sum += array[ARRAY_SIZE];
C中的数组索引从0变为size-1,所以在这里你可能会“一个接一个”