mysticalstick
mysticalstick

Reputation: 2559

what is the default value of an array in C++?

If I were to create an array with int* array = new int[10]; and fill part of the array with values, how can I check how much of the array is filled? I want to loop through and check if each value is the default value but I'm not sure what the default value of each array element is. Would it be null 0 or garbage values?

Upvotes: 11

Views: 34785

Answers (8)

user12002570
user12002570

Reputation: 1

By default, the objects allocated by new are default initialized. This mean when you wrote:

int* array = new int[10]; //block of 10 uninitialized ints

Here, all of the 10 ints are uninitialized. That is, they have indeterminate value.


It is possible to value initialize the elements by adding an empty pair of parenthesis as shown below:

int* array = new int[10](); //block of 10 ints value initialized to 0

Here all of the 10 ints are initialized to 0.


But note that although we can use empty parentheses to value initialize the elements of an array, we cannot supply an element initializer inside the parentheses. This means for example,

int* array = new int[10](55); // INVALID 

The above statement is invalid because we cannot supply an element initializer inside the parenthesize.

You can use std::fill_n instead of supplying an element initializer inside the parentheses as shown below:

int* array = new int[10];                 //block of 10 uninitialized ints
std::fill_n(array, 10, 55);              // all elements will now hold 55

Upvotes: 0

Dhawan Gayash
Dhawan Gayash

Reputation: 463

I don't know if this helps but in c++17 onwards there's the std::array class that can be used. In this class you have the option to use class functions such as std::array.fill(...)

std::array<int, 10> arr;
arr.fill(-1);

cpp docs: cpp-docs

This get's you closer to the experience from other languages such as Java and Python both having Arrays.fill(arr, -1); and arr = [-1]*N respectively to fill the array with non-default values.

Upvotes: 0

c z
c z

Reputation: 8967

It should be pointed out the default is uninitialized only for basic types like int. classes will use their defined parameterless constructor. Here is a MWE that wraps an int in such a class. OP also asked about checking the values so that is here too:

#include <iostream>

struct Element {
    int Value;
    Element() : Value{42} {}
};

struct Array {
    Element Values[10];
};

int main() {
    Array array;
    
    for(Element element: array.Values)
        std::cout << element.Value << " ";
}

Note: POD (or record) classes, which have no custom constructor, will remain uninitialised. Non-POD classes that have no parameterless constructor cannot usually be held in arrays.

Upvotes: 0

SergV
SergV

Reputation: 1277

You can solve your problem by a more C++ way. You can create struct or class, which contain your value and bool flag. Bool flag must be set to false in default constructor and set to true in operator=. There is ready implementation of such class - boost.optional. std::optional will be in C++17.

#include <boost/optional.hpp>
#include <iostream>

int main()
{
    const size_t nArr = 100;
    auto pArr = new boost::optional<int>[nArr];
    const size_t nInit = 30;
    for (size_t i = 0; i < nInit; ++i)
    {
       pArr[i] = i;  //initialize nInit first values of pArr
    }
    size_t n = 0;
    for (; n < nArr; ++n)
    {
         if (!pArr[n].is_initialized()) break;
         // or more compact form:
         //if(!pArr[n]) break;
         assert(*pArr[n] == n);
    }
    std::cout << "nInit = " << nInit << ", n = " << n << std::endl;
    assert(nInit == n);
    delete[] pArr;
}

Upvotes: 1

user6359267
user6359267

Reputation:

The default value of array is indeterminate means garbage.

how can I check how much of the array is filled?

You cannot check, C/C++ has no array bounds check. You have to do it yourself.You need to keep track of the data inserted by a user. When your counter reaches the size of the array, the array is full

Upvotes: 4

R Sahu
R Sahu

Reputation: 206577

You can't do what are you hoping to, not when the type is int.

The uninitialized elements of the array will have unpredictable values. In addition, accessing those elements is cause for undefined behavior.

You can initialize the elements of the array to a sentinel value at the time of allocation using:

int* ptr = new int[10]{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};

Use whatever sentinel value works for you if -1 does not.

Upvotes: 6

Gary Holiday
Gary Holiday

Reputation: 3562

This is how to set a default value in C++ when making an array.

int array[100] = {0};

Now every element is set to 0. Without doing this every element it garbage and will be undefined behavior if used.

Not all languages are like this. Java has default values when declaring a data structure but C++ does not.

Upvotes: 17

SurvivalMachine
SurvivalMachine

Reputation: 8356

There is no default value so it's garbage.

Upvotes: 5

Related Questions