请考虑以下代码:
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
分配内存。
在这种情况下,我遇到了分段错误。有没有什么好方法可以动态分配内存?如果我需要重新分配内存(动态增大数组大小)怎么办?
在这种情况下,系统如何在知道
y
的实际内存大小之前为y[i].x
分配内存。
哦,但它确实知道y[i].x
的大小。该成员的类型是struct X*
,它是一个指针。指针的大小在体系结构之间变化,但通常是64位中的32位。无论X
是什么(像函数指针这样的边缘情况很少)。
换句话说,X
不是Y
。实际上Y
有一个指针,指向由(可能是多个)X
占用的一块内存。
这就像有一个地址。你可以把它写在一张小纸上,保留它。每个人都知道纸张的大小。无论有多少(以及多大)房屋占据了实际的位置。
您的分段错误与所有这些无关。你很可能已经越过了一些边界。但是如果没有实际的代码,很难说清楚。
在这种情况下,系统如何在知道
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
类管理。
y[i].x
始终是一个指针,在每个系统上都有固定的大小。 (大部分是32/64位)。这就是为什么系统知道为每个Y实例分配多少内存的原因。
在这种情况下,在知道y [i] .x的实际内存大小之前,系统如何为y分配内存
在Y中,x的类型是指向X的指针,因此大小是指针的大小,指定的内存块的大小在分配Y时是不相关的
有没有什么好方法可以动态分配内存?如果我需要重新分配内存(动态增大数组大小)怎么办?
显然你需要一个std::vector<X>
而不是一个指向X的指针,你使用的是C ++,而不是C语言