【问题标题】:Using realloc() on a Stack在堆栈上使用 realloc()
【发布时间】:2017-06-14 14:15:27
【问题描述】:

我正在编写一些简单的堆栈操作,我的数据结构是一个数组。

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

目标是编写一个函数来动态设置 Stack 的大小,同时确保元素不丢失。

这是我目前所拥有的:

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

感谢任何建议!谢谢

【问题讨论】:

  • 你不能使用#define的方式你试图使用它们(作为变量)。
  • 您在哪里定义 stacky 并不是 100% 清楚,但在 C 中,您不能编写像变量在函数外部时显示的初始化程序。
  • 请注意,在代码void Sizer( int size) { /* newline */ #undef DEFAULT_VAL /* newline */ #define DEFAULT_VAL size /* newline */ maxSize = size; 中,您实际上并未使用DEFAULT_VALsize 的定义很奇怪。请记住,预处理器会在编译时进行文本替换。代码可以工作——但是使用预处理器来做你似乎想要做的事情是不正当的,特别是因为宏实际上并没有被使用。
  • 感谢您指出这一点!我知道预处理器的作用,但我似乎现在才明白我的错误。我删除了 #undef DEFAULT_VAL#define DEFAULT_VAL size
  • 阅读flexible array members。您可能会发现非常很有用

标签: c stack dynamic-memory-allocation realloc


【解决方案1】:

来自手册页:

realloc() 函数改变指向的内存块的大小 to by ptr to size bytes.

所以而不是:

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

你可能想要

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

顺便说一句:使用malloc 和朋友时不需要演员表。见Do I cast the result of malloc?

【讨论】:

  • 欣赏!删除演员表后,我收到错误 - 从 void*int* 的无效转换。
  • @Arjun - invalid conversion 听起来很奇怪 - 你使用的是 c++ 编译器而不是 c 编译器吗?
  • 我正在使用 Dev-C++!
  • @Arjun - 所以您可能使用 c++ 编译器编译您的 c 代码。因此,c++ 的规则适用并且使用 c++ 你必须强制转换。请记住,c 和 c++ 是两种不同的语言。许多基本事物非常相似,但并不完全相同。如果你想写c代码,一定要编译成c代码。
  • @Arjun - BTW:选角不是我回答的核心。重要的是 realloc 调用使用了错误的大小。
猜你喜欢
  • 2014-10-13
  • 2013-12-31
  • 2011-12-08
  • 1970-01-01
  • 2023-03-23
  • 2013-05-10
  • 2010-11-06
  • 2021-07-02
  • 1970-01-01
相关资源
最近更新 更多