Как динамически распределять память внутри структур?

Для задания на этой неделе в моем классе CS мы должны пересмотреть нашу текущую программу, чтобы динамически распределять память для всех массивов. Мы должны убедиться, что на пустые элементы не тратится память. Мы должны сделать это путем присвоения символьных массивов временным массивам, проверки размера temp, а затем выделения массива такого размера.

Во всяком случае, я не понимаю, как это сделать с помощью структуры. Я знаю, как динамически распределять память, например

int* pointer = new int(5);

Но как мне это сделать для членов структуры? Кажется, что если вы не укажете размер заранее, компьютер не будет знать, сколько места выделено, когда вы объявляете структуру этого типа.

Прямо сейчас мое определение структуры выглядит так:

struct card
{
char rank[10];
char suit[10];
char color;
bool dealt;
char location[12];
};

Как изменить все массивы, которые будут объявлены динамически, без указания размера?

1

Решение

struct card
{
char *rank;
char *suit;
char color;
bool dealt;
char *location;
};

Просто возьмите указатели внутри структуры и динамически выделите им память, не забудьте освободить их после использования.

4

Другие решения

struct card
{
char* rank;
char* suit;
char color;
bool dealt;
char* location;
};

Компилятору не нужно знать размер, который вы выделяете, поскольку вся эта структура будет хранить указатель на выделенную память.

Размер указателей и, следовательно, структура будут одинаковыми, если вы выделите 1 элемент или 1000 элементов каждый.

card c;
c.location = new char[10];

постскриптум Просто проверяете, знаете ли вы, что приведенный ниже код выделил 1 элемент и устанавливает его на 5, а не на 5 элементов? Увидеть википедия за разницу между двумя видами использования.

int* pointer = new int(5);
3

используя char * rank? и когда вы используете его, card-> rank = malloc (sizeof (char) * size)?

1

В любом случае вам не нужно менять свои структурные переменные, просто измените способ их вызова с помощью typedef:

typdef struct _CARD
{
char rank[10];
char suit[10];
char color;
bool dealt;
char location[12];
} CARD;

Чтобы инициализировать массив использования CARD:

CARD* card;
#define ARRSIZE 12

card = (CARD*)malloc(sizeof(CARD)*ARRSIZE);

Для более динамического размещения структуры используйте связанный список, вызывая саму структуру в качестве указателя:
typdef struct _CARD

 typdef struct _CARD {
char rank[10];
char suit[10];
char color;
bool dealt;
char location[12];
struct _CARD  *_next;
} CARD;

и инициализировать каждую структуру по мере необходимости и связать их, используя указатель _next:

    CARD *card,*tmp,*final,*first,*etc;
card = (CARD*)malloc(sizeof(CARD));
tmp= (CARD*)malloc(sizeof(CARD));
card->_next = tmp;
final = (CARD*)malloc(sizeof(CARD));
tmp->_next = final;
final->_next = NULL;

и так далее, вам нужно иметь дополнительные функции для управления динамически создаваемыми структурами и их связями.

-1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector