C for loop segmentation fault

2019-08-14 04:25发布


I am getting a segmentation fault error when I try to compile this code on gcc.

#include <stdio.h>
#include <stdlib.h>

#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;

I'm trying to speed up a for loop as much as I can so I am trying crazy things. How do I get rid of the segmentation fault? Also should I try a different method of optimization?


So your original problem was due to the fact that you were using i instead of j in your array index in the inner loop and since N_TIMES is much larger than ARRAY_SIZE you will end up overflowing your array bounds which is undefined behavior.

The corrected code still has one obvious problem:

sum += array[ARRAY_SIZE];

The valid indices for array will go from 0 to ARRAY_SIZE-1 so accessing element ARRAY_SIZE is invoking undefined behavior by going outside the array bounds.


  1. The compiler will almost certainly optimize better than you. Don't try to outthink the compiler.

  2. Problem is almost certainly sum += array[ARRAY_SIZE]; Array indexes in C go from 0 to size-1, so here you are probably going "one off the end"