【问题标题】:Pointer to array and errors C2057, C2540指向数组的指针和错误 C2057、C2540
【发布时间】:2015-02-12 21:12:45
【问题描述】:

我想做这样的事情:

const int N = 10;
void foo (const int count)
{
  int (* pA) [N][count] = reinterpret_cast<int(*)[N][count]>(new int[N * count]);
  ...
}

但是我的编译器(VS2010)不想这样做:

错误 C2057:预期的常量表达式
错误 C2540:非常量表达式作为数组绑定

他这样表达对count的不满。

我知道,如何通过稍微不同的方式来解决它。但我就是不明白,为什么 C++ 禁止我使用this 方式。我明白,为什么 C++ 需要在编译时知道堆栈数组大小(以分配数组内存)。但是为什么对于指向数组的指针也需要同样的限制(毕竟,指针只是使用分配的内存的工具)?

【问题讨论】:

  • const 不足以保证编译时的可了解性(因此,用作数组绑定)。
  • @Lightness Races in Orbit,但我不使用 count 作为数组绑定。我的意思是,作为一个真实数组的界限。我尝试将它用作数组的边界,它只是一个指针的虚拟掩码,可以使用已分配的内存。这就是为什么在我看来,这种限制是不恰当的。我意识到我错了,但我不明白,在哪里?
  • 您没有使用count 来绑定实际数据是不够的。即使只是尝试将它用作类型的一部分(就像您在这里所做的那样)已经是不可能的。类型是编译时构造,但表达式 count 在运行时之前是没有意义的。那么这应该如何工作呢?

标签: c++ arrays compiler-errors restrictions pointer-to-array


【解决方案1】:

嗯,实际上你想要的原则上是可以的,但是你使用了错误的语法。

除了第一个维度之外的所有维度都必须是编译时常量,因为它们用于指针算术。第一个可以是运行时变化的。这有效:

int (* pA)[N] = new int[count][N];

请记住,数组与指向元素类型的指针兼容,并且下标在两者上的工作方式完全相同。因此,当您分配了一个二维数组(数组数组)时,您应该存储一个指向一维数组的指针。

不过,没有办法做到int[N][count],因为这需要一个可变大小的元素数组(子数组)。

此外,请注意N 是一个常量表达式,但count 不是。即使它们都具有相同的类型,count 也是一个参数,在运行时确定。

如果您想接受一个常量整数表达式作为参数,请将其设为模板参数:

template <int count>
void foo()

现在count 是一个常量表达式,就像N

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2023-03-11
    • 2017-09-03
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多