简体   繁体   中英

Allocating memory to pointer multidimensional array with new

I can't understand some basic thing in c++ and have been wondering. Please help me. I understand that p points to memory that would be a 2D int matrix of 3x4 size.

int(*p)[3][4];

1) Why can't I allocate memory like following?

p = new int[3][4];

2) It should be like following to work. But why?

p = new int [1][3][4];    //or new int [5][3][4]; etc

3) What does following line of code mean? It is semantically correct but what is it doing? What is significance of empty [] in following line?

p = new int [ ][3][4];

c++ is a strongly typed language. int is not the same as int* . Likewise int[3] is not the same type as int* . But just lightly poke int[3] with a stick and it will fall apart and decay to an int* . c++ does this because c does it.


Why can't I allocate memory like following?

 p = new int[3][4]; 

Because the new is returning a pointer to int[4] :

auto p1 = new int[3][4]; // int(*p1)[4]

The array has decayed to a pointer. It has lost the type and first dimension . It would be best to avoid pointers for arrays and stick to using templates and references . Or better yet, prefer std::vector or std::array .

You could have multiple pointers to the same address, but with different types , which can be confusing .


2) It should be like following to work. But why?

 p = new int [1][3][4]; 

In this example the array of int[3][4] s has also decayed to a pointer:

auto p2 = new int [1][3][4]; // int(*p2)[3][4]

So here the value returned by new can be assigned to p because it has the same type. Note however that the pointer type doesn't include information about the size of the array, it only has a type that points to elements which happen to be arrays of a lower dimension (that haven't decayed to pointers).


3) What does following line of code mean? It is semantically correct but what is it doing? What is significance of empty [] in following line?

 p = new int [ ][3][4]; 

This might not always compile, and if it does then it is a compiler extension that will determine the value of the empty square brackets.

Because in C, "int *p" has two interpretations. You can consider P to be a pointer to a single integer, but it can also be considered to be a pointer to an array of integer.

A common example, strings. char *a = "hello";

"a" is a pointer to a single character, 'h', but more commonly it is treated as a pointer to an array of characters, aka a string.

So, you can do this: char * a = new char[6]; strcpy(a, "hello");

I believe that your third example is not valid C++.

While this: p = new int [9][3][4]; Allocates an array of 9 two dimensional arrays of 3x4.

Try this test:

int test()
{
    int(* p)[3][4] = new int[1][3][4];

    printf("sizeof(p)=%d, sizeof(*p)=%d\n", sizeof(p), sizeof(*p) / sizeof(int));

    size_t q1 = (size_t)&p[0][0][0];
    size_t q2 = (size_t)&p[1][0][0];
    printf("p, diff: %d\n", (q2 - q1) / sizeof(int));

    size_t r1 = (size_t)&p[0][0][0];
    size_t r2 = (size_t)&p[0][1][0];
    printf("p, diff: %d\n", (r2 - r1) / sizeof(int));

    size_t s1 = (size_t)&p[0][0][0];
    size_t s2 = (size_t)&p[0][0][1];
    printf("p, diff: %d\n", (s2 - s1) / sizeof(int));
    return 0;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM