How can I find the number of elements in an array?
Asked Answered
W

16

80

I have an int array and I need to find the number of elements in it. I know it has something to do with sizeof but I'm not sure how to use it exactly.

Wilt answered 24/4, 2012 at 1:30 Comment(3)
Take a look at this. #4081600Libation
If you're on MSVC, you have _countofPermeate
While everyone has the solution, I want to point out that it is very likely that there is no way to find the size of a dynamic array unless you have recorded the size because sizeof(a) of the pointer a is the size of the pointer int *a = new int[10] in this case finding sizeof(*a) is 4 byte. So it's important to keep your array size checking.Orissa
H
78

If you have your array in scope you can use sizeof to determine its size in bytes and use the division to calculate the number of elements:

#define NUM_OF_ELEMS 10
int arr[NUM_OF_ELEMS];
size_t NumberOfElements = sizeof(arr)/sizeof(arr[0]);

If you receive an array as a function argument or allocate an array in heap you can not determine its size using the sizeof. You'll have to store/pass the size information somehow to be able to use it:

void DoSomethingWithArray(int* arr, int NumOfElems)
{
    for(int i = 0; i < NumOfElems; ++i) {
        arr[i] = /*...*/
    }
}
Holpen answered 24/4, 2012 at 1:52 Comment(0)
K
31
int a[20];
int length;
length = sizeof(a) / sizeof(int);

and you can use another way to make your code not be hard-coded to int

Say if you have an array array

you just need to:

int len = sizeof(array) / sizeof(array[0]);
Kym answered 24/4, 2012 at 1:41 Comment(1)
i have this one implemented and is giving me a size of 1 where it should be 720 elements ....Superphysical
S
20

I personally think that sizeof(a) / sizeof(*a) looks cleaner.

I also prefer to define it as a macro:

#define NUM(a) (sizeof(a) / sizeof(*a))

Then you can use it in for-loops, thusly:

for (i = 0; i < NUM(a); i++)
Shurlocke answered 24/4, 2012 at 2:19 Comment(2)
You could do this, but it would result in calculating the size every time it does the test in the for loop, so once every iteration. And so it would be doing division every single time thru the loop. It would be more efficient to assign the result of NUM(a) to an instance variable right above the loop, and use that value in the loop.Disqualify
@Disqualify no, it wouldn't calculate the size for every iteration. The compiler is smart enough to see that the results of each sizeof as well as the division are constant and determines the result at compile time, which it subsequently compiles into the code as a constant number. You may have been misled by the looks of the sizeof application, which looks like a function due to the parentheses, but it isn't a function. sizeof is an operator and the parentheses are just a convention.Afflictive
L
15

It is not possible to find the number of elements in an array unless it is a character array. Consider the below example:

int main()
{
    int arr[100]={1,2,3,4,5};
    int size = sizeof(arr)/sizeof(arr[0]);
    printf("%d", size);
    return 1;
}

The above value gives us value 100 even if the number of elements is five. If it is a character array, you can search linearly for the null string at the end of the array and increase the counter as you go through.

Lotze answered 30/4, 2015 at 10:51 Comment(9)
I thing you wanted to write: printf("%d", size);. But you are correct, you can find only defined size of array, not actual size!Tannenberg
The array size is 100. A completely different thing is that at the moment you have only used 5 elements of it. I doubt this is a valid initializer, BTW.Measles
"It is not possible to find the number of elements in an array unless it is a character array." The other 2 answers do it thoughDanish
@Danish that's only when the number of elements in the array is the same as the size.Dyscrasia
@BVB44 But aren't there 100 elements? The last 95 are zeroes?Harakiri
@Harakiri I was not referring to the above answer, I was talking about the other 2 answers mentioned by SantropedroDyscrasia
@BVB44 Yes, but you say "only when the number of elements in the array is the same as the size", but my point is that the number of elements is always the same as the size, but there will be elements set to 0 after what is defined in the static initializer. This applies to the above answer and the 2 other answers.Harakiri
@Harakiri when I say "number of elements", I mean elements that the user explicitly set values to i.e. non-zero values. OP would want int arr[100]={1,2,3,4,5}; to return 5 elements even though technically there are 100.Dyscrasia
I understand what you meant, my point is that your imprecision and assumptions lead to confusion. How do you know what the OP meant? When I say "number of elements" I mean "number of elements". Using that more accurate definition would make this answer and your comment wrong, wouldn't you agree?Harakiri
A
14

In real we can't count how many elements are store in array

But you can find the array length or size using sizeof operator.

But why we can't find how many elements are present in my array.

Because when we initialise an array compiler give memory on our program like a[10] (10 blocks of 4 size) and every block has garbage value if we put some value in some index like a[0]=1,a[1]=2,a[3]=8; and other block has garbage value no one can tell which value is garbage and which value is not garbage that's a reason we cannot calculate how many elements in an array. I hope this will help you to understand. Little concept

Actinomycin answered 11/8, 2020 at 17:0 Comment(1)
This is a misleading answer. An array is indeed a block of contiguous memory, but the standard guarantees that T[4] has the byte size of sizeof(T) * 4. Which in turn means elementCount = sizeof(arr)/sizeof(arr[0]) Whether the elements are initialized or not has nothing to do with the amount of memory it allocates.Azimuth
T
7

Super easy.

Just divide the number of allocated bytes by the number of bytes of the array's data type using sizeof().

For example, given an integer array called myArray

int numArrElements = sizeof(myArray) / sizeof(int);

Now, if the data type of your array isn't constant and could possibly change, then make the divisor in the equation use the size of the first value as the size of the data type.

For example:

int numArrElements = sizeof(myArray) / sizeof(myArray[0]);

This way, the code is type agnostic and will function correctly no matter the data type of the array.

Twum answered 12/5, 2019 at 6:15 Comment(0)
G
3

I used following code as suggested above to evaluate number of elements in my 2-dimensional array:

#include <stdio.h>
#include <string.h>

void main(void)
{
    char strs[3][20] =
    {
        {"January"},
        {"February"},
        {""}
    };

    int arraysize = sizeof(strs)/sizeof(strs[0]);

    for (int i = 0; i < arraysize; i++)
    {
        printf("Month %d is: %s\n", i, strs[i]);
    }

}

It works nicely. As far as I know you can't mix up different data types in C arrays and also you should have the same size of all array elements (if I am right), therefore you can take advantage of that with this little trick:

  1. count number of bytes with sizeof() function from whole 2d array (in this case 3*20 = 60 bytes)
  2. count number of bytes with sizeof() function from first array element strs[0] (in this case 20 bytes)
  3. divide whole size with size of one element what will give you number of elements

This snipped should be portable for 2d arrays in C however in other programming languages it could not work because you can use different data types within array with different sizes (like in JAVA).

Goldagoldarina answered 20/12, 2014 at 2:57 Comment(0)
D
3

The question is simple: given a C++ array (e.g. x as in int x[10]), how would you get the number of elements in it?

An obvious solution is the following macro (definition 1):

#define countof( array ) ( sizeof( array )/sizeof( array[0] ) )

I cannot say this isn’t correct, because it does give the right answer when you give it an array. However, the same expression gives you something bogus when you supply something that is not an array. For example, if you have

int * p;

then countof( p ) always give you 1 on a machine where an int pointer and an int have the same size (e.g. on a Win32 platform).

This macro also wrongfully accepts any object of a class that has a member function operator[]. For example, suppose you write

class IntArray {
private:
    int * p;
    size_t size;
public:
    int & operator [] ( size_t i );
} x;

then sizeof( x ) will be the size of the x object, not the size of the buffer pointed to by x.p. Therefore you won’t get a correct answer by countof( x ).

So we conclude that definition 1 is not good because the compiler does not prevent you from misusing it. It fails to enforce that only an array can be passed in.

What is a better option?

Well, if we want the compiler to ensure that the parameter to countof is always an array, we have to find a context where only an array is allowed. The same context should reject any non-array expression.

Some beginners may try this (definition 2):

template <typename T, size_t N>
size_t countof( T array[N] )
{
   return N;
}

They figure, this template function will accept an array of N elements and return N.

Unfortunately, this doesn’t compile because C++ treats an array parameter the same as a pointer parameter, i.e. the above definition is equivalent to:

template <typename T, size_t N>
size_t countof( T * array )
{
    return N;
}

It now becomes obvious that the function body has no way of knowing what N is.

However, if a function expects an array reference, then the compiler does make sure that the size of the actual parameter matches the declaration. This means we can make definition 2 work with a minor modification (definition 3):

template <typename T, size_t N>
size_t countof( T (&array)[N] )
{
    return N;
}

This countof works very well and you cannot fool it by giving it a pointer. However, it is a function, not a macro. This means you cannot use it where a compile time constant is expected. In particular, you cannot write something like:

int x[10];

int y[ 2*countof(x) ]; // twice as big as x

Can we do anything about it?

Someone (I don’t know who it is – I just saw it in a piece of code from an unknown author) came up with a clever idea: moving N from the body of the function to the return type (e.g. make the function return an array of N elements), then we can get the value of N without actually calling the function.

To be precise, we have to make the function return an array reference, as C++ does not allow you to return an array directly.

The implementation of this is:

template <typename T, size_t N>
char ( &_ArraySizeHelper( T (&array)[N] ))[N];

#define countof( array ) (sizeof( _ArraySizeHelper( array ) ))

Admittedly, the syntax looks awful. Indeed, some explanation is necessary.

First, the top-level stuff

char ( &_ArraySizeHelper( ... ))[N];

says _ArraySizeHelper is a function that returns a reference (note the &) to a char array of N elements.

Next, the function parameter is

T (&array)[N]

which is a reference to a T array of N elements.

Finally, countof is defined as the size of the result of the function _ArraySizeHelper. Note we don’t even need to define _ArraySizeHelper(), -- a declaration is enough.

With this new definition,

int x[10];

int y[ 2*countof(x) ]; // twice as big as x

becomes valid, just as we desire.

Am I happy now? Well, I think this definition is definitely better than the others we have visited, but it is still not quite what I want. For one thing, it doesn’t work with types defined inside a function. That’s because the template function _ArraySizeHelper expects a type that is accessible in the global scope.

I don’t have a better solution. If you know one, please let me know.

Deserved answered 14/2, 2019 at 2:13 Comment(3)
This is a C question. Not C++Measles
I find this answer excellent even though it offers C++ solutions. ThanksWellspring
"This means you cannot use it where a compile time constant is expected." - You can by just adding the keyword constexpr...Alberik
P
2
#include<stdio.h>
int main()
{
    int arr[]={10,20,30,40,50,60};
    int *p;
    int count=0;

    for(p=arr;p<&arr+1;p++)
        count++;

    printf("The no of elements in array=%d",count);

    return 0;
}

OUTPUT=6

EXPLANATION

p is a pointer to a 1-D array, and in the loop for(p=arr,p<&arr+1;p++) I made p point to the base address. Suppose its base address is 1000; if we increment p then it points to 1002 and so on. Now coming to the concept of &arr - It basically represents the whole array, and if we add 1 to the whole array i.e. &arr+1, it gives the address 1012 i.e. the address of next 1-D array (in our case the size of int is 2), so the condition becomes 1000<1012.

So, basically the condition becomes

for(p=1000;p<1012;p++)

And now let's check the condition and count the value

  • 1st time p=1000 and p<1012 condition is true: enter in the loop, increment the value of count to 1.
  • 2nd time p=1002 and p<1012 condition is true: enter in the loop, increment the value of count to 2.
  • ...
  • 6th time p=1010 and p<1012 condition is true: enter in the loop, increment the value of count to 6.
  • Last time p=1012 and p<1012 condition is false: print the value of count=6 in printf statement.
Predicament answered 2/3, 2016 at 19:14 Comment(3)
This does not work (at least in C++). You would have to cast &arr+1 to (int*) like that: for(p=arr;p<(int*)(&arr+1);p++)Maryannmaryanna
You are comparing an int * to an int (*)[]. I don't think that is guaranteed to work. And for sure, it's not the best way to do it.Measles
Is it possible to make this function generic? I tried using void* but no success.Lucrecialucretia
M
2

sizeof returns the size in bytes of it's argument. This is not what you want, but it can help.

Let's say you have an array:

int array[4];

If you apply sizeof to the array (sizeof(array)), it will return its size in bytes, which in this case is 4 * the size of an int, so a total of maybe 16 bytes (depending on your implementation).

If you apply sizeof to an element of the array (sizeof(array[0])), it will return its size in bytes, which in this case is the size of an int, so a total of maybe 4 bytes (depending on your implementation).

If you divide the first one by the second one, it will be: (4 * the size of an int) / (the size of an int) = 4; That's exactly what you wanted.

So this should do:

sizeof(array) / sizeof(array[0])

Now you would probably like to have a macro to encapsulate this logic and never have to think again how it should be done:

#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))

You need the parentheses enclosing all the macro as in any other complex macro, and also enclosing every variable, just to avoid unexpected bugs related to operators precedence.

Now you can use it on any array like this:

int array[6];
ptrdiff_t nmemb;

nmemb = ARRAY_SIZE(array);
/* nmemb == 6 */

Remember that arguments of functions declared as arrays are not really arrays, but pointers to the first element of the array, so this will NOT work on them:

void foo(int false_array[6])
{
        ptrdiff_t nmemb;

        nmemb = ARRAY_SIZE(false_array);
        /* nmemb == sizeof(int *) / sizeof(int) */
        /* (maybe  ==2) */
}

But it can be used in functions if you pass a pointer to an array instead of just the array:

void bar(int (*arrptr)[7])
{
        ptrdiff_t nmemb;

        nmemb = ARRAY_SIZE(*arrptr);
        /* nmemb == 7 */
}
Measles answered 12/5, 2019 at 10:43 Comment(0)
F
2

we can find number of elements in array only if array is declared in this format

int a[]={1,2,3,4,5,6};

number of element in array is

 n=sizeof(a) / sizeof(a[0]);

we should no able to calculate array size if it is declared like this int a[10]={1,2,3,4,5,6}

Favien answered 3/7, 2021 at 14:11 Comment(0)
F
1
void numel(int array1[100][100])
{
    int count=0;
    for(int i=0;i<100;i++)
    {
        for(int j=0;j<100;j++)
        {
            if(array1[i][j]!='\0') 
            {
                count++;
                //printf("\n%d-%d",array1[i][j],count);
            }
            else 
                break;
        }
    }
    printf("Number of elements=%d",count);
}
int main()
{   
    int r,arr[100][100]={0},c;
    printf("Enter the no. of rows: ");
    scanf("%d",&r);
    printf("\nEnter the no. of columns: ");
    scanf("%d",&c);
    printf("\nEnter the elements: ");
    for(int i=0;i<r;i++)
    {
        for(int j=0;j<c;j++)
        {
            scanf("%d",&arr[i][j]);
        }
    }
    numel(arr);
}

This shows the exact number of elements in matrix irrespective of the array size you mentioned while initilasing(IF that's what you meant)

Filia answered 26/2, 2020 at 11:3 Comment(0)
N
1

Assuming you have an array with elements 1,3,4. To know its length, you'd need to use the sizeof function as follows:

int myArray[] = {1,3,4};
int len = sizeof(myArray) / sizeof(myArray[0]);

You can check the number of elements by printing the output as follows:

cout<<"This array has " << len << " elements";
 

The full program would be as follows:

#include <iostream>

using namespace std;

int main()
{
    
    
    int myArray[] = {1,3,4};
    int len = sizeof(myArray) / sizeof(myArray[0]);
 

    cout<<"The array has " << len << "elements";
    return 0;
}
Noddle answered 2/7, 2021 at 19:52 Comment(0)
T
-1

i mostly found a easy way to execute the length of array inside a loop just like that

 int array[] = {10, 20, 30, 40};
 int i;
 for (i = 0; i < array[i]; i++) {
    printf("%d\n", array[i]);
 }
Thormora answered 31/8, 2017 at 2:3 Comment(1)
When should this loop stop? This is plainly wrong and Undefined Behaviour.Measles
A
-1

If we don't know the number of elements in the array and when the input is given by the user at the run time. Then we can write the code as

C CODE:

while(scanf("%d",&array[count])==1) { 
  count++;
}

C++ CODE:

while(cin>>a[count]) {
  count++;
}

Now the count will be having the count of number of array elements which are entered.

Aftershock answered 7/2, 2018 at 17:0 Comment(1)
And what is the size of the array? This has nothing to do with the question. And the behaviour is undefined because you may easily overflow the array.Measles
P
-4

Actually, there is no proper way to count the elements in a dynamic integer array. However, the sizeof command works properly in Linux, but it does not work properly in Windows. From a programmer's point of view, it is not recommended to use sizeof to take the number of elements in a dynamic array. We should keep track of the number of elements when making the array.

Pupil answered 6/7, 2016 at 7:32 Comment(1)
The sizeof operator will only return the size of an array declared within the same scope, otherwise, sizeof simply reports the size of the pointer to which the array was converted when passed as a parameter. It has nothing to do with OS and there is no recommendation against using sizeof on either other than understanding what you are taking the sizeof. (no pun intended).Unfasten

© 2022 - 2024 — McMap. All rights reserved.