2015-04-05 1 views
0

Так что я эта структураКак я могу динамически обновлять массив внутри структуры?

#define MAX 128 

typedef struct this_struct { 
Type items[MAX]; 
int top; 
} *SVar; 

Допустит, мы создаем что-то вроде этого

SVar first = malloc(sizeof(struct this_struct)); 

Теперь, когда я нажимаю значение в массив, и он заполняет в MAX, который 128, мне нужно динамически создайте новый массив, но я не знаю, как он находится внутри массива.

Вот мои текущие мысли о том, как я хочу, чтобы это сделать:

  • Создание новых имен SVAR "второго" с второго> элементов [MAX * 2]
  • бесплатно (первый)

Как я могу это сделать?

UPDATE

Так что теперь у меня есть это

#define MAX 128 

typedef struct this_struct { 
Type *items; 
int top 
} *SVar; 

Теперь, чтобы создать первое распределение:

SVar s = malloc(sizeof(struct this_struct)); 
s->items = malloc(sizeof(Type)*MAX); 

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

SVar second; 

if(s->top == MAX- 1) { 

    second = malloc(sizeof(*second)); 
    second->items = malloc(sizeof(Type)*MAX*2); 

} 

free(s); 
s = &second; 

Это сбой моей программы. Я не знаю почему.

+0

используйте указатель, а не массив. Например: 'Type items [MAX];' chage to 'Type * items;' – BLUEPIXY

+0

@BLUEPIXY, допустим, я использую указатель. Как это изменится, как я могу манипулировать его размером? – code

+0

'SVar second = malloc (sizeof (* second)); second-> items = malloc (sizeof (Type) * MAX * 2);' – BLUEPIXY

ответ

0

Типичный способ сделать это состоит в том, чтобы ваша структура содержала три значения: во-первых, указатель на массив переменных и второй подсчет размера выделенного в данный момент массива, и на практике вам понадобится третий элемент для отслеживайте количество используемых слотов массива.

Итак, с вашей структуры, было бы что-то вроде этого:

Type *items; 
int item_length; /* Number allocated */ 
int item_count; /* Number in use */ 

вы сначала выделить «партию» записей, скажем, 100:

first = malloc(sizeof(this_struct)); 
first->items = malloc(sizeof(Type) * 100); 
first->item_length = 100; 
first->item_count = 0; 

Затем вы добавляете элементы по одному время.Упрощенно, это так:

first->items[first->item_count] = new_item; 
first->item_count += 1; 

Но на самом деле вы должны убедиться, что каждый раз, когда вы не собираетесь переполнить в настоящее время распределённого пространства, так что действительно так:

if (first->item_count == first->item_length) { 
    first->item_length += 100; 
    first->items = realloc(first->items, sizeof(Type) * first->item_length); 
} 
first->items[first->item_count] = new_item; 
first->item_count += 1; 

Вы в основном просто используя слоты по одному, пока ваше выделенное пространство достаточно велико. После того, как вы используете все выделенное вами пространство, realloc либо расширит массив на месте, если в адресном пространстве будет место, либо он найдет и выделит новое пространство большего размера и переместит все существующие данные в новое место (и освобождение старого пространства).

На практике вы должны проверить возвращаемое значение в вызовах malloc и realloc.

+0

Сверху вниз, обозначая фрагменты кода как шаги 1-4: Можно ли использовать шаг 3-4 в функции push нажмите новое значение поверх стека? – code

+0

Также, что делает sizeof (Type)? Могу ли я использовать начальный размер (100)? – code

+0

Аргумент malloc - это количество байтов, которое нужно выделить. Большинство типов больше 1 байта, поэтому вам нужно выделить N байтов на элемент. Это то, что «sizeof (Type)» дает вам: сколько байтов требуется для каждого элемента этого типа. –

0

Обычный Хитрость заключается в том, чтобы сделать что-то вроде этого:

typedef struct { 
    int max_items; /* enough memory allocated for so many items */ 
    ... 
    Whatever_type items[1]; /* must be the last member */ 
} Dyn_array; 
... 
int n = 127; 
Dyn_array *p = malloc(sizeof(Dyn_array) + n*sizeof(p.items[0]); 
p->max_items = n + 1; 
... 
n = 1023; 
p = realloc(p, sizeof(Dyn_array) + n*sizeof(p.items[0]); 
p->max_items = n + 1; 

и так далее. Код, использующий структуру, выполняет внеочередные чтения и записи в массив items, который объявляется для хранения только одного элемента. Это нормально, однако, так как C не выполняет никаких ограничений, и политика распределения памяти должна гарантировать, что для num_items предметов всегда достаточно места.