2017-01-29 3 views
-3

Я пишу несколько простых операций стека с моей структурой данных, являющейся массивом.Использование realloc() на стеке

#define DEFAULT_VAL 10  //in a separate Header file 
int *stacky = (int*) malloc (default_size * sizeof(int)); 

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

Вот то, что я до сих пор:

void Sizer(int size) 
{ 
    #undef DEFAULT_VAL 
    #define DEFAULT_VAL size 
    maxSize = size; 
    int *newbuffer = (int*) realloc (stacky, size); 
    if(newbuffer == NULL) //checking if the 'realloc' was successful :) 
    { 
     printf("PROBLEM HERE :)");    
    } 
    else 
    { 
     stacky = newbuffer;  
    } 
} 

В моей main() функции:

int main() 
{ 
    int i; 
    for(i=1; i<15; i++) 
    { 
    push(i); 
    } 
    Sizer(9); 
    displayStack(); 
    Sizer(17); 
    displayStack(); 
} 

Выход есть:

DEFAULT_VAL is now: 9 
     9. 9 
     8. 8 
     7. 7869816 
     6. 7877384 
     5. 17278 
     4. 385207786 
     3. 3 
     2. 2 
     1. 1 

DEFAULT_VAL is now: 17 
     9. 9 
     8. 8 
     7. 7869816 
     6. 7877384 
     5. 17278 
     4. 50331651 
     3. 3 
     2. 2 
     1. 1 

Любые советы оценили! Благодаря

+0

Вы не можете использовать '# define' так, как вы пытаетесь их использовать (как переменные). – tkausl

+0

Это не 100% понятно, где вы определяете 'stacky', но на C вы не можете написать инициализатор, как показано на рисунке, когда переменная находится вне функции. –

+1

Обратите внимание, что в коде 'недействительным Sizer (размер INT) {/ * символ новой строки */ #undef DEFAULT_VAL/* символ новой строки */#define размер DEFAULT_VAL/* символ новой строки */ MaxSize = размер;', вы не фактически используйте 'DEFAULT_VAL'. Определение «размер» является нечетным. Помните, что препроцессор выполнил бы замену текста во время компиляции. Код может работать, но использование препроцессора для выполнения того, что вы пытаетесь сделать, является извращенным, тем более, что макрос фактически не используется. –

ответ

2

От человека странице:

перераспределить() функция изменяет размер блока памяти указал на PTR от до размера байт.

Таким образом, вместо:

int *newbuffer = (int*) realloc (stacky, size); 

вы, вероятно, хотите

int *newbuffer = (int*) realloc (stacky, size * sizeof(int)); 

BTW: Нет необходимости в гипсе при использовании malloc и друзей. См. Do I cast the result of malloc?

+0

Цените его! После удаления броска я получаю ошибку - недопустимое преобразование из 'void *' в 'int *'. – Arjun

+0

@Arjun - Звучит странно с 'invalid conversion' - вы используете компилятор C++ вместо c-компилятора? – 4386427

+0

Я использую Dev-C++! – Arjun

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