【问题标题】:Allocating memory to pointer multidimensional array with new使用 new 将内存分配给指针多维数组
【发布时间】:2017-01-18 19:03:39
【问题描述】:

我无法理解 C++ 中的一些基本内容,并且一直在想。请帮我。 我知道 p 指向的内存将是 3x4 大小的 2D 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 不,我没有添加任何内容

标签: c++ arrays multidimensional-array new-operator


【解决方案1】:

c++ 是一种强类型语言。 intint* 不同。同样int[3]int* 的类型不同。但是只要用一根棍子轻轻戳一下int[3],它就会分崩离析,变成int*。 c++ 这样做是因为 c 这样做。


为什么我不能像下面这样分配内存?

p = new int[3][4];

因为new 正在返回指向int[4] 的指针:

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

数组有一个指向指针的decayed。它有lost the type and first dimension。最好避免使用数组指针并坚持使用using templates and references。或者更好的是,更喜欢std::vectorstd::array

你可以有多个指向同一个地址的指针,but with different typescan be confusing


2) 应该像下面这样工作。但为什么呢?

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

在这个例子中,int[3][4]s 的数组也衰减为一个指针:

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

所以这里new返回的值可以赋值给p,因为它具有相同的类型。但是请注意,指针类型不包含有关数组大小的信息,它仅具有指向恰好是较低维度数组(尚未衰减为指针)的元素的类型。


3) 下面这行代码是什么意思?它在语义上是正确的 但它在做什么?下面的空[]是什么意思 行吗?

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

这可能并不总是编译,如果编译,那么它是一个compiler extension,它将确定空方括号的值。

【讨论】:

    【解决方案2】:

    因为在 C 中,“int *p”有两种解释。 您可以将 P 视为指向单个整数的指针,但也可以将其视为指向整数数组的指针。

    一个常见的例子,字符串。 char *a = "你好";

    “a”是指向单个字符“h”的指针,但更常见的是,它被视为指向字符数组的指针,也就是字符串。

    所以,您可以这样做: 字符 * a = 新字符 [6]; strcpy(a, "你好");

    我认为您的第三个示例不是有效的 C++。

    虽然这样: p = 新整数 [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;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-02-23
      • 2012-06-02
      • 2016-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-25
      • 1970-01-01
      • 2011-01-16
      相关资源
      最近更新 更多