2017-02-08 4 views
0

я иметь следующую структуру:Реализовано Нажмите() на стек с помощью динамического массива

typedef struct{ 
    void** array; 
    int top; 
    int capacity; 
} ArrayStack; 

и выталкивающий() функцию, как показано ниже:

void push(ArrayStack* P, void* data){ 
    P->top++; 
    if(P->top <= P->capacity){ 
     P->capacity++; 
     P->array = realloc(P->array, (P->capacity) * sizeof(void*)); 
    } 

    P->array[P->top] = data; 
} 

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

Ниже приведен код, я использую для тестирования функции createStack():

ArrayStack* createStack(){ 
    ArrayStack* ret = (ArrayStack*) malloc(sizeof(ArrayStack)); 
    ret->top = -1; 
    ret->capacity = 0; 
    return ret; 
} 
    int main(){ 
     ArrayStack* testStack = createStack(); 
     int* ins = (int*) malloc(sizeof(int)); 
     *ins = 123; 
     push(testStack, ins); 
    }  

Любая помощь будет оценили заранее спасибо

+0

'if (P-> top> = P-> capacity)' выглядит лучше –

+1

Вы никогда не инициализировали 'array'; установите его в 'NULL' в' createStack'. – Ryan

+0

Обычный комментарий к 'malloc': не набрасывайте возвращаемое значение, так как оно может, например, скрыть забытый' #include '. Еще проще, используйте 'ArrayStack * ret = malloc (sizeof * ret);' и вам не нужно заменять 2 или 3 вхождения, если вы когда-либо заменяете 'ArrayStack' чем-то другим (дополнительно:' sizeof' не является функцией, но оператор). Ditto 'int * ins = malloc (sizeof * ins);'. NB: обычно оператор '*' сидит рядом с именем переменной, а не типом, при объявлении указателей. – Evert

ответ

2

P->array = realloc(P->array, (P->capacity) * sizeof(void*));

Когда эта линия называется p->array должна быть выделенная память или значение NULL (если NULL возвращает новую память). Инициализация p->array не отображается.