Reputation: 88207
I was working on an assignment (details in another question). As part of it, I was increasing the size of the array. And found that when I try to initialize an array:
int arr[2097152]; // 8MB
I got segmentation fault ... I think its because I am trying to declare an array that too large? Then I found the way to get around this is to use malloc
. But being new to C (mainly use JavaScript/Python/Java ...). I get very confused with pointers and stuff ...
I've declared an array 8MB:
int *arr = malloc (MBs * 1024 * 1024 / sizeof(int)); // MBs = 8
But now ... how do I access it, or write to it? When I use it like arr
am I getting the address, and if I use *arr
I get the 1st element?
Upvotes: 8
Views: 36717
Reputation: 11966
What you also can try is to put the big array as a static variable - out of the stack area. Probably you won't have segfault any more.
Upvotes: 2
Reputation: 16406
Use it like arr[index]
, just as if it were declared as an array. In C, the notation x[y]
is exactly equivalent to *(x + y)
. This works in the case of an array because the array name is converted to a pointer to its first element.
int *arr = malloc (MBs * 1024 * 1024 / sizeof(int));
This is not a good approach (and doesn't make it the size you want), because you don't have the number of elements handy. You should declare it based on the number of elements, e.g.,
#define ARR_LENGTH 2097152
int *arr = malloc (ARR_LENGTH * sizeof *arr);
You need to multiply by the element size because malloc's argument is a byte count.
Upvotes: 11
Reputation: 5389
Yes, you can use it the same way as an ARRAY.
int *arr = malloc (MBs * 1024 * 1024) ;
arr[0] = 1 ;
arr[6] = 675 ;
etc. ;
*arr = arr[0] ; \First element
Upvotes: 3
Reputation: 206546
I think its because I am trying to declare an array that too large?
Yes, Indeed. You are most likely doing this in a function. Wherein the array is created on local storage on stack and usually stack will not be big enough to cater to demands of this big size.
The usual solution is to use dynamic memory.
How do I access it, or write to it? When I use it like
arr
I am getting the address, and if I use*arr
I get the 1st element?
You can access it in similar way as you use an array by using the []
operator.
Note that,
arr[i] == i[arr] == *(arr + i) == *(i + arr)
So,
arr[0] ---> Gives you first element
arr[1] ---> Gives you Second element
and so on...
Note that the name of the array decays as an pointer to its first element sometimes but arrays and pointers are not the same!
Good Read:
Upvotes: 5
Reputation: 477070
The notation a[i]
is identical to *(a + i)
(and thus also to i[a]
, since addition is commutative). Thanks to pointer arithmetic and array-to-pointer decay, you can use this syntax for both arrays and pointers-to-array-elements:
int a[10];
int * b = a + 4;
int * c = malloc(sizeof(int) * 100);
a[2]; // third element of a
b[1]; // sixth element of a
c[3]; // fourth element of the array starting at c
free(c); // don't forget to clean up!
As to your first problem: There is indeed only limited space available for automatic variables. Overrunning this space is called... stack overflow.
Upvotes: 3