Динамически распределяемый структурный массив с динамически распределяемым структурным массивом - PullRequest
0 голосов
/ 26 февраля 2019

Пожалуйста, рассмотрите следующий код:

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.

Яполучить ошибку сегментации в этом случае.Есть ли хороший способ динамически распределять память?Что если мне нужно перераспределить память (чтобы динамически увеличивать размер массива)?

Ответы [ 4 ]

0 голосов
/ 26 февраля 2019

y[i].x всегда указатель, который имеет фиксированный размер в каждой системе.(В основном это 32/64 бит).Вот почему система знает, сколько памяти выделить для каждого экземпляра Y.

0 голосов
/ 26 февраля 2019

В таком случае, как система будет выделять память для 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.

0 голосов
/ 26 февраля 2019

В таком случае, как система будет выделять память для y, прежде чем узнает фактический объем памяти y[i].x.

О, но она знает размерy[i].x.Тип этого члена struct X*, который является указателем.Размер указателя варьируется в зависимости от архитектуры, но обычно составляет 32 из 64 бит.Независимо от того, что такое X (есть несколько крайних случаев, таких как указатели на функции).

Другими словами X не является частью Y.На самом деле Y имеет указатель, который указывает на часть памяти, занятую (возможно, несколькими) X.

Это похоже на наличие адреса.Вы можете записать это на небольшой лист бумаги и сохранить его.Все знают размер бумаги.Независимо от того, сколько (и сколько) домов занимают фактическое место.

Ваша ошибка сегментации не имеет ничего общего со всем этим.Скорее всего, вы пересекли какую-то границу.Но трудно сказать без реального кода.

0 голосов
/ 26 февраля 2019

В таком случае, как система будет выделять память для y, прежде чем узнает фактический объем памяти y [i] .x

В Y тип x является указателем на X , поэтому размер является размером указателя, размер указанного блока памяти не имеет значения при выделении Y

Есть ли хороший способ динамически распределять память?Что если мне нужно перераспределить память (чтобы динамически увеличивать размер массива)?

Видимо, вам нужен std::vector<X> вместо указателя на X, вы находитесь в C ++, а не в C

...