C ++将堆内存分配给结构数组中的每个元素(struct)

时间:2016-06-15 01:10:24

标签: c++ struct

我真的很困惑为struct分配内存。

考虑一下。

struct A {
    ....
}

A* array = new A[5];

// here I am trying to assign memory to array[0]

&(array[0]) = new A; << error

但这给了我一个错误

  

作为赋值的左操作数所需的左值

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

提前谢谢。

4 个答案:

答案 0 :(得分:0)

类型A*没有保存指针,应该使用new单独分配。 A*是一个连续的内存块,它包含一个或多个完整的A实例。

这意味着

A* array = new A[3];

将分配类似

的内容
|  A  |  A  |  A  |

和每个&#34;单元&#34;将是大sizeof(A)个字节。因此,在您的情况下,您已经有5个A实例,这些实例已经构建完毕。

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

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

这将创建一个由3 A*个元素组成的连续数组,这些元素是指向A的指针:

|  A*  |  A*  |  A*  |

广告每个单元格都很大sizeof(A*)

现在,您可以为数组中的元素分配在堆上分配的特定A实例。例如:

array[0] = new A();

产生类似

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

答案 1 :(得分:0)

定义时:

A* array = new A[5];

你有一个A数组。所以你的五个A所需的内存已经分配。

您可以使用array [0]等直接访问该元素。

如果要在A:

上定义指针数组
A **array = new A*[5];

然后你必须用以下内容分配内存:

array[0] = new A;

答案 2 :(得分:0)

其他回复没有错,但我只是想提出一些一般意见:

永远不要在C ++中使用new。 new是在编写库代码时极少数情况下需要的低级函数。

也永远不要在C ++中使用C风格的数组。今天标准库中有更好的替代品。我的猜测是你应该使用std :: vector(或者std :: array)。现在,您可以完全使用值并避免使用指针。

答案 3 :(得分:0)

你应该在指针和数组之间做出明确的差异

using ( var waveFileReader = new AudioFileReader( FileNameIn ) )
{
    var outFormat = new WaveFormat( 4100 , waveFileReader.WaveFormat.Channels );
    using ( var resamplerCurrent = new MediaFoundationResampler( waveFileReader , outFormat ) )
    {
        resamplerCurrent.ResamplerQuality = 60;
        WaveFileWriter.CreateWaveFile( tmpFile , resamplerCurrent );
    }
}
using ( var waveFileReader = new AudioFileReader( FileNameIn ) )
{
    var resamplerCurrent = new WdlResamplingSampleProvider( waveFileReader , 4100 );
    WaveFileWriter.CreateWaveFile16( tmpFile , resamplerCurrent );
}

看起来像这样。

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

Array可以保存多个值。 所以你应该使用A **,a * [N]。

         memory
           ---
pointer =>  A
           ---
            A
           ---

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