Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why can't I create an array with size determined by a global variable?

Why does the array a not get initialized by global variable size?

#include<stdio.h>  int size = 5;  int main() {     int a[size] = {1, 2, 3, 4, 5};     printf("%d", a[0]);      return 0; } 

The compilation error is shown as

variable-sized object may not be initialized

According to me, the array should get initialized by size.

And what would be the answer if I insist on using global variable (if it is possible)?

like image 517
Ashish Yadav Avatar asked Mar 11 '10 17:03

Ashish Yadav


People also ask

How do you declare an array globally?

1. An array can be declared with the initialization of practical values in one statement in any scope (global, function, nested local scope). 2. An array can be declared without initialization of practical values in the global scope and then have assigned practical values in function scope or nested local scope.

Why can't you change the size of an array?

If you create an array by initializing its values directly, the size will be the number of elements in it. Thus the size of the array is determined at the time of its creation or, initialization once it is done you cannot change the size of the array.

Can we initialize array globally?

In C++, global variables are value-initialized (i.e. the array contents will be set to 0 ).

Can you declare an array size with a variable Java?

Since arrays are objects in Java, we can find their length using the object property length. This is different from C/C++, where we find length using sizeof. A Java array variable can also be declared like other variables with [] after the data type.


1 Answers

In C99, 6.7.8/3:

The type of the entity to be initialized shall be an array of unknown size or an object type that is not a variable length array type.

6.6/2:

A constant expression can be evaluated during translation rather than runtime

6.6/6:

An integer constant expression shall have integer type and shall only have operands that are integer constants, enumeration constants, character constants, sizeof expressions whose results are integer constants, and floating constants that are the immediate operands of casts.

6.7.5.2/4:

If the size is an integer constant expression and the element type has a known constant size, the array type is not a variable length array type; otherwise, the array type is a variable length array type.

a has variable length array type, because size is not an integer constant expression. Thus, it cannot have an initializer list.

In C90, there are no VLAs, so the code is illegal for that reason.

In C++ there are also no VLAs, but you could make size a const int. That's because in C++ you can use const int variables in ICEs. In C you can't.

Presumably you didn't intend a to have variable length, so what you need is:

#define size 5 

If you actually did intend a to have variable length, I suppose you could do something like this:

int a[size]; int initlen = size; if (initlen > 5) initlen = 5; memcpy(a, (int[]){1,2,3,4,5}, initlen*sizeof(int)); 

Or maybe:

int a[size]; for (int i = 0; i < size && i < 5; ++i) {     a[i] = i+1; } 

It's difficult to say, though, what "should" happen here in the case where size != 5. It doesn't really make sense to specify a fixed-size initial value for a variable-length array.

like image 95
Steve Jessop Avatar answered Sep 25 '22 15:09

Steve Jessop