массив размещения указателей - PullRequest
0 голосов
/ 21 декабря 2009

typedef struct { структура таблицы ** символы; // массив стека int top; // индекс верхнего элемента размер int; // максимальный размер стека } Стек; * +1001 *

void *createStack(int size)
{
  stack *stck;
  stck = (stack *) malloc(sizeof(stack));

  stck->symbols  = ....

  stck->size = size;
  stck->top = -1;
  printf("stack is created --> size is : %d \n",size);
}

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

Ответы [ 4 ]

4 голосов
/ 21 декабря 2009
malloc(size * sizeof(struct table*));
3 голосов
/ 21 декабря 2009
(struct table **)malloc(size * sizeof(struct table*));

Но это если вы хотите предварительно выделить все пространство сразу. Если вы хотите выделять больше по ходу работы, вы можете начать с чего-то меньшего, чем size, и выделять больше в функции push (), когда у вас заканчивается свободное пространство.

1 голос
/ 21 декабря 2009

Символы должны быть массивом 1-го указателя на структуру таблицы или двумерным массивом структуры таблицы?

stck->symbols = malloc(sizeof *(stck->symbols) * numberOfElements);

для любого значения numberOfElements. Учитывая, что тип символов stck-> struct table **, тип выражения *(stck->symbols) будет struct table *. Вы также можете написать

malloc(sizeof (struct table*) * numberOfElements);

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

Поскольку это C, вы не должны разыгрывать результат malloc(), и это считается плохой практикой; если вы забудете включить stdlib.h или иным образом не иметь прототип для malloc() в области действия, приведение будет подавлять предупреждение, предупреждающее вас о проблеме (хотя, поскольку C99 больше не позволяет неявную типизацию int, это может больше не проблема).

0 голосов
/ 21 декабря 2009
stck->symbols  = baseaddress = malloc(...required total size...);

int nextDataLocation = baseAddress + numberOfRows*sizeof(void*);

for(int i=0; i<numberOfLines; i++)
{
    stck->symbols[i] = nextDataLocation;
    ..copy string i to address stck->symbols[i]...
    nextDataLocation += lengthOfString[i];
}
...