2017-01-29 74 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

请注意,在代码中'void Sizer(int size) {/ * newline */ #undef DEFAULT_VAL/* newline */ #define DEFAULT_VAL size/* newline */ maxSize = size;',实际上使用'DEFAULT_VAL'。 “尺寸”的定义很奇怪。请记住,预处理器将在编译时进行文本替换。代码可以工作 - 但使用预处理器来做你似乎试图做的事情是不正当的,特别是因为宏没有被实际使用。 –

回答

2

从手册页:

的realloc()的函数改变内存块的大小指出 由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 - “无效转换”听起来很奇怪 - 你使用C++编译器而不是c编译器吗? – 4386427

+0

我正在使用Dev-C++! – Arjun