2

I am using GCC + the terminal to make an array of prime numbers.

I once asked on #C@irc.freenode.net, but I still don't understand:

An int can store values on 32 bits (so a total of 2^32 unique values), but can't an array have more than 2^24 values ?

I'm not sure, but is Why 24 bits registers? already answers my question ?

And does that mean that making an array of long int doesn't solve the problem ? Is there some (proportionately fast) way I can bypass this, like using an int[][] to store those numbers ? Or maybe an include or lib to use an arbitrary number of bytes to store numbers ?



    int main()  
    {  
        int array1[160000];  
        printf("first array declared fine.\n");  
        int array2[170000];  

        int array3[1600000];  
        printf("first array declared fine.\n");  
        int array4[1700000];  

        int array5[16000000];  
        printf("first array declared fine.\n");  
        int array6[17000000];  
    }

Community
  • 1
  • 1
gokoon
  • 1,017
  • 3
  • 11
  • 14
  • I'm not so shure what you want to do. But array should have no problem to hold more than 2^24 Values. (That are only around 16 Million Elements) Maybe you can give an Example code? – nuriaion Jun 23 '10 at 09:47
  • 2
    Are you creating the array on the stack? If so, a stack overflow may cause the segfault. – mtvec Jun 23 '10 at 09:53
  • How many elements does your array have? At which index did the segmentation fault occur? Can you show the offending region of the code? – vpit3833 Jun 23 '10 at 10:06
  • I edited my question, added the code that causes segfault on my macbook pro. The thing that I don't understand is that if I remove the 4 last array declarations, it doesn't segfault. – gokoon Jun 23 '10 at 10:20

1 Answers1

5

Since you are creating your arrays on the stack, I suppose your segfault is caused by a stack overflow. I would suggest creating such big arrays on the heap, like this:

int* array = malloc(17000000 * sizeof(int));

So the reason that you get a segfault has nothing to do with using indexes larger than 2^24 but with the fact that the size of all your arrays combined is larger than the size of the stack, causing a stack overflow.

mtvec
  • 17,846
  • 5
  • 52
  • 83