Search code examples
c++arrayspointersnew-operator

c++ creating a static like array with "new" or another way of creating a dynamic array


I know that the common technique of creating a dynamic array using new in C++ is:

int * arr = new int[5];

A book also says:

short tell[10]; // tell is an array of 20 bytes
cout << tell << endl; // displays &tell[0]
cout << &tell << endl; // displays address of the whole array
short (*p)[10] = &tell; // p points to an array of 20 shorts

Now I wonder if there is a way to allocate memory for an array using new, so it can be then assigned to a pointer to the whole array. It might look like this:

int (*p)[5] = new int[5]; 

The above example doesn't work. The left side looks correct to me. But I don't know what should be on the right.

My intention is to understand if it's possible. And I know that there are std::vector and std::array.

Update:

Here is what I actually wanted to check:

int (*p1)[5] = (int (*)[5]) new int[5];
// size of the whole array
cout << "sizeof(*p1) = " << sizeof(*p1) << endl;

int * p2 = new int[5];
// size of the first element
cout << "sizeof(*p2) = " << sizeof(*p2) << endl;

And here is how to access these arrays:

memset(*p1, 0, sizeof(*p1));
cout << "p1[0] = " << (*p1)[0] << endl;

memset(p2, 0, sizeof(*p2) * 5);
cout << "p2[0] = " << p2[0] << endl;

Solution

  • know that the common technique of creating a dynamic array

    In C++ that was written 20 years ago, maybe.

    These days you should use std::vector for dynamic arrays and std::array for fixed size array.

    If your framework or platform supplies additional array classes (like QT's QVector), they are fine too, as long as you don't mess with C-pointers directly, and you have RAII-based array class.

    and as for concrete answer, new T[size] always returns T* , so you cannot catch a pointer returned by new[] with T(*)[size].