可能重复:
Is it possible to dynamically create an array of constant size in C++?
这是一个理论问题 - 我想知道为什么C ++中的operator new []会返回指向数组第一个元素的指针而不是实际数组(或指向它的指针)。在尝试做
之类的事情时,我遇到了这个问题typedef int int4[4];
int4* ni4 = new int4;
虽然我知道为什么这不起作用(虽然在开始时它不是很清楚;)),但它确实让我觉得代码原则上A* ptr= new A;
无法编译。我是唯一发现这种奇怪的人吗?
答案 0 :(得分:1)
我觉得奇怪的是使用了operator new[]
。代码尝试分配聚合的单个实例,如果聚合是struct
,这将是合法的。
但这是[expr.new]
部分标准所述的行为。
但是,有一个非常简单的解决方法:
typedef int int4[4];
int4* ni4 = new int4[1];
...
delete [] ni4;
答案 1 :(得分:0)
我不太确定我是否理解你的问题。在C ++中,与C一样,指向数组第一个元素的指针与数组本身没有区别。
编辑:正如我所指出的,这不是真的正确 - 请原谅我的错误,我最近花了太多时间使用Java和C#; - )答案 2 :(得分:0)
可能会为以下
辩护new (int[N]); // type int(*)[N]
new int[N]; // type int*
new T; /* T* */
仅在中间情况下,N
可以是运行时值。然而,规范并没有建立这种类型的差异。几乎在所有情况下,数组都需要特殊处理(例如,你不能只复制它们)。所以你应该准备好特别处理它们。例如,在您的情况下,您还必须使用delete[]
而不是delete
。
为了说清楚,如果上述情况属实,那么你需要笨拙的语法
int (*p)[N] = new (int[N]);
(*p)[N-1] = 0;
p[0][N-1] = 0; /* or, equivalently */
p[N-1] = 0; /* but not this, error! */
首先需要取消引用数组指针。
答案 3 :(得分:0)
它是来自C的遗产,实际上它是B的遗产.C ++中对原生数组的整个处理非常糟糕,但它们无法改变它。这就是C ++中许多问题的情况。