6

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;

2 Answers 2

4

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].

Sign up to request clarification or add additional context in comments.

5 Comments

So, that means that it is not possible to allocate memory for this construction int (*p)[5] =. Right?
you can forcefully cast it with c-cast (int(*)[5])new int[5], but please, don't do it in real code.
I am just playing around it and trying to get dipper understanding. BTW, why are you saying not to do it in real code?
because we don't use C pointers and C-casts unless we really have to. and I guess you don't really have to.
That is a good point =) . Many thanks. I've got what I want. Now I will supplement my question, because I cannot put a bloc of code here.
1

The problem is that left and right sights have different types.

The type of:

new int[5]

is

int*.

The type of:

int (*p)[5]

is

int (*)[5].

And compiler cannot assign one to another.

Generally speaking it is impossible to assign T* to T (*)[N]. That is why you need to use the syntax mentioned in the beginning of your question.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.