Search code examples
c++sizeof

How do sizeof(arr) / sizeof(arr[0]) work?


When looking for a size of an array in a for loop I've seen people write

int arr[10];
for(int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){}

How is sizeof(arr) / sizeof(arr[0]) the length of the array? How does it technically work?


Solution

  • If you have an array then sizeof(array) returns the number of bytes the array occupies. Since each element can take more than 1 byte of space, you have to divide the result with the size of one element (sizeof(array[0])). This gives you number of elements in the array.

    Example:

    std::uint32_t array[10];
    
    auto sizeOfInt = sizeof(std::uint32_t); // 4
    auto numOfBytes = sizeof(array); // 10*sizeOfInt = 40
    auto sizeOfElement = sizeof(array[0]); // sizeOfInt = 4
    auto numOfElements = sizeof(array) / sizeof(array[0]); // numOfBytes / sizeOfElement = 40 / 4 = 10
    

    LIVE EXAMPLE

    Note that if you pass an array to a function, the above won't work since the array decays to a pointer and sizeof(array) returns the size of the pointer.

    std::size_t function(std::uint32_t a[]) // same for void function(std::uint32_t a[10])
    {
        return sizeof(a); // sizeof(std::uint32_t*)!
    }
    
    std::uint32_t array[10];
    auto sizeOfArray = function(array); // array decays to a pointer inside function()
    

    LIVE EXAMPLE #2