C 在结构数组中为每个元素(struct)分配堆内存

C++ Assigning heap memory to each element(struct) in array of structs

本文关键字:struct 分配 内存 元素 结构 数组      更新时间:2023-10-16

我对将内存分配给结构感到非常困惑。

考虑这个。

struct A {
    ....
}
A* array = new A[5];
// here I am trying to assign memory to array[0]
&(array[0]) = new A; << error

但这给我一个错误

lVALUE所需的作业左操作数

我不确定如何将struct A的内存分配给array[0]

预先感谢您。

类型A*不能容纳应用new单独分配的指针。A*是一个连续的内存块,它具有1个或更多完整的实例。

这意味着

A* array = new A[3];

将分配

之类的东西
|  A  |  A  |  A  |

每个"单元"将是大的sizeof(A)字节。因此,在您的情况下,您已经有5个A实例了,这些实例将已经构造。

如果您想将分配在堆上分配的实例,那么您不需要A*而不是A**

A** array = new A*[3];

这创建了一个连续的3个A*元素,这是A的指示:

|  A*  |  A*  |  A*  |

AD每个单元格是大sizeof(A*)

现在,您可以分配给数组的元素,一个在堆上分配的特定实例。例如:

array[0] = new A();

产生

之类的东西
|  A*  | ...
   |
   |
   --> |  A  |

定义:

A* array = new A[5];

您有一个A数组。因此,您的五个A所需的内存已分配。

您可以直接使用数组[0]等直接访问元素

如果要在A上定义指针数组:

A **array = new A*[5];

然后,您必须使用:

分配内存
array[0] = new A;

其他答复并没有错,但我只想提供一些一般建议:

切勿在C 中使用新的。新是仅在编写库代码时极少数情况下需要的低级功能。

也从不使用C 中的C风格数组。如今,标准库中有更好的选择。我的猜测是您应该使用std :: vector(或者也许是std :: array)。现在,您可以与价值充分合作并避免指针。

您应该在指针和数组之间明确差异

A* pointer = new A[2];
A* array[2] = { new A,new A };

看起来像这样。

         memory
           ---
pointer =>  A
           ---
            A
           ---
           ---
array[0]=>  A
           ---
           ...
           ---
array[1]=>  A
           ---

数组可以保存几个值。因此,您应该使用**,*[n]。

struct A {
    ....
}
A* array = new A[5];
array = new A; << this will work ,but new A[5] will lost