动态分配的结构数组,带有动态分配的结构数组元素

问题描述 投票:2回答:4

请考虑以下代码:

struct X
{
   int x1;
   int x2;
};

struct Y
{
   int y1;
   struct X *x;
};

现在我动态分配内存如下:

struct Y *y = new Y[N];

对于这个结构数组的每个元素,我也为y[i].x分配内存如下 -

y[i].x = new X[M];

在这种情况下,系统如何在知道y的实际内存大小之前为y[i].x分配内存。

在这种情况下,我遇到了分段错误。有没有什么好方法可以动态分配内存?如果我需要重新分配内存(动态增大数组大小)怎么办?

c++ structure dynamic-memory-allocation
4个回答
4
投票

在这种情况下,系统如何在知道y的实际内存大小之前为y[i].x分配内存。

哦,但它确实知道y[i].x的大小。该成员的类型是struct X*,它是一个指针。指针的大小在体系结构之间变化,但通常是64位中的32位。无论X是什么(像函数指针这样的边缘情况很少)。

换句话说,X不是Y。实际上Y有一个指针,指向由(可能是多个)X占用的一块内存。

这就像有一个地址。你可以把它写在一张小纸上,保留它。每个人都知道纸张的大小。无论有多少(以及多大)房屋占据了实际的位置。

您的分段错误与所有这些无关。你很可能已经越过了一些边界。但是如果没有实际的代码,很难说清楚。


3
投票

在这种情况下,系统如何在知道y的实际内存大小之前为y[i].x分配内存。

编译知道指针的大小,因为当前声明了x。 当您尝试取消引用y[i].x时,最有可能发生分段错误,因为您从未正确分配它应指向的内存。

有没有什么好方法可以动态分配内存?

就在这里。您应该使用std::vector让它处理为您进行手动内存管理的所有障碍和陷阱:

struct X
{
   int x1;
   int x2;
};

struct Y
{
   int y1;
   std::vector<X> x;
};

std::vector<Y> y(N);
y[i].x.resize(M);

如果我需要重新分配内存(动态增大数组大小)怎么办?

这也将由std::vector类管理。


2
投票

y[i].x始终是一个指针,在每个系统上都有固定的大小。 (大部分是32/64位)。这就是为什么系统知道为每个Y实例分配多少内存的原因。


0
投票

在这种情况下,在知道y [i] .x的实际内存大小之前,系统如何为y分配内存

在Y中,x的类型是指向X的指针,因此大小是指针的大小,指定的内存块的大小在分配Y时是不相关的

有没有什么好方法可以动态分配内存?如果我需要重新分配内存(动态增大数组大小)怎么办?

显然你需要一个std::vector<X>而不是一个指向X的指针,你使用的是C ++,而不是C语言

© www.soinside.com 2019 - 2024. All rights reserved.