Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What type is used in C++ to define an array size?

Tags:

c++

avr

Compiling some test code in avr-gcc for an 8-bit micro-controller, the line

const uint32_t N = 65537;
uint8_t values[N]; 

I got the following compilation warning (by default should be an error, really)

warning: conversion from 'long unsigned int' to 'unsigned int' changes value from '65537' to '1' [-Woverflow]
uint8_t values[N];

Note that when compiling for this target, sizeof(int) is 2.

So it seems that, at an array size cannot exceed the size of an unsigned int.

Am I correct? Is this GCC-specific or is it part of some C or C++ standard?

Before somebody remarks that an 8-bit microcontroller generally does not have enough memory for an array so large, let me just anticipate saying that this is beside the point.

like image 447
Fabio Avatar asked Jan 15 '19 16:01

Fabio


People also ask

What data type is array in C?

Array in C are of two types; Single dimensional arrays and Multidimensional arrays. Single Dimensional Arrays: Single dimensional array or 1-D array is the simplest form of arrays that can be found in C. This type of array consists of elements of similar types and these elements can be accessed through their indices.

How do you define the size of an array?

Array size. The size of an array is the product of the lengths of all its dimensions. It represents the total number of elements currently contained in the array. For example, the following example declares a 2-dimensional array with four elements in each dimension.

What is the size of array data type?

Array size must be between 1 and 2147483647 (MAXINT). To refer to an element in a one-dimensional array, use the array name and an expression in square brackets that evaluates to the position of the element in the array.

How do you declare an array in C?

To create an array, define the data type (like int ) and specify the name of the array followed by square brackets []. To insert values to it, use a comma-separated list, inside curly braces: int myNumbers[] = {25, 50, 75, 100}; We have now created a variable that holds an array of four integers.


2 Answers

size_t is considered as the type to use, despite not being formally ratified by either the C or C++ standards.

The rationale for this is that the sizeof(values) will be that type (that is mandatated by the C and C++ standards), and the number of elements will be necessarily not greater than this since sizeof for an object is at least 1.

like image 127
Bathsheba Avatar answered Nov 15 '22 23:11

Bathsheba


So it seems that, at an array size cannot exceed the size of an unsigned int.

That seems to be the case in your particular C[++] implementation.

Am I correct? Is this gcc-specific or is it part of some C or C++ standard?

It is not a characteristic of GCC in general, nor is it specified by either the C or C++ standard. It is a characteristic of your particular implementation: a version of GCC for your specific computing platform.

The C standard requires the expression designating the number of elements of an array to have an integer type, but it does not specify a particular one. I do think it's strange that your GCC seems to claim it's giving you an array with a different number of elements than you specified. I don't think that conforms to the standard, and I don't think it makes much sense as an extension. I would prefer to see it reject the code instead.

like image 25
John Bollinger Avatar answered Nov 15 '22 23:11

John Bollinger