我真的很困惑为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]
。
提前谢谢。
答案 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
---