2013-02-22 2 views
1

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

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

int* pointer = new int(5); 

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

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

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

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

+0

Вы знаете, как получить доступ к переменной внутри структуры? –

+0

no @ user1362548 'deck1.color = 'A'' –

+0

@ user1362548 Теперь измените все свои массивы на указатели. Затем обращайтесь к каждому указателю внутри него и производите выделение памяти. –

ответ

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

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

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

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

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

int* pointer = new int(5); 
+0

Спасибо, просто нужно знать, как это работает за кулисами, и ваше описание имеет смысл. – Bobazonski

+0

@ user1362548, пожалуйста, прочитайте последние несколько строк, возможную ошибку в коде. –

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

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

1

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

0

В любом случае, вам не нужно, чтобы изменить переменные структуры, просто изменить то, как вы это называете, используя ЬурейеЕ:

typdef struct _CARD 
    { 
    char rank[10]; 
    char suit[10]; 
    char color; 
    bool dealt; 
    char location[12]; 
    } 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; 

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

Смежные вопросы