使用new为指针多维数组分配内存

3

我对C++中的一些基本概念有些困惑,希望能够得到帮助。

我了解p指向的是一个大小为3x4的二维int矩阵所在的内存地址。

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

1)为什么我不能按照以下方式分配内存?

p = new int[3][4];

2) 如果要使其正常工作,应该像以下这样。但是为什么呢?

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

3) 以下代码的含义是什么?它在语义上是正确的,但它在做什么?以下代码中空的 [] 的意义是什么?

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

@Muscampester 不,我没有添加任何东西。 - eyllanesc
2个回答

2
C++是一种强类型语言。int和int*不是相同的类型,同样,int[3]也不是相同类型的int*。但只要轻轻拨动int[3],它就会瓦解并退化为int*。C++这样做是因为C语言也是这样做的。

Why can't I allocate memory like following?

p = new int[3][4];
因为“new”返回一个指向“int [4]”的指针:
auto p1 = new int[3][4]; // int(*p1)[4]

该数组已经腐朽成了一个指针。它已经失去了类型和第一维度。最好避免使用指针来处理数组,而是坚持使用模板和引用。或者更好的方法是使用std::vectorstd::array
你可以有多个指向相同地址的指针,但类型不同,这可能会令人困惑

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

p = new int [1][3][4];
在这个例子中,int[3][4]数组也已经衰减为指针:
auto p2 = new int [1][3][4]; // int(*p2)[3][4]

因此,new 返回的值可以分配给 p,因为它们具有相同的类型。但请注意,指针类型不包括有关数组大小的信息,它只有指向元素的类型,这些元素恰好是低维度的数组(尚未衰减为指针)。


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];
这段代码可能不会总是编译通过,如果它能够编译通过,那么就是一个编译器扩展决定了空方括号的值。

1
在C语言中,“int *p”有两种解释。您可以将P视为指向单个整数的指针,但也可以将其视为指向整数数组的指针。
一个常见的例子是字符串。 char *a =“hello”;
“a”被视为指向单个字符'h'的指针,但更常见的是将其视为指向字符数组(即字符串)的指针。
因此,您可以这样做: char * a = new char [6]; strcpy(a,“hello”);
我认为您的第三个示例不是有效的C++。
而这个: p = new int [9][3][4]; 分配了一个由9个二维数组组成的3x4数组。
尝试这个测试:
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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接