堆栈内容中保存的数据不断变化,无法增加

时间:2015-01-22 21:01:06

标签: c stack push peek

所以这是我的问题,我一直试图在过去的5个小时内解决这个问题,我有一个头文件,一个测试文件和一个c源文件。我真的很想了解发生了什么,以及为什么我可以在将来避免这个问题。头文件声明了struct但没有定义它:

typedef struct Stack *StackP;

在我的源文件Stack.c中我定义了堆栈:

struct Stack
{
  int top;
  int capacity;
  int count;
  ItemT items;
};

其中ItemT定义为char *

在测试文件中,调用是:

StackP stackPtr = newStack();

我在c源文件中的newStack函数的内容是:

StackP newStack(void) {
  struct Stack stack1;
  StackP stackPtr = &stack1;
  (stackPtr->items) = (ItemT)malloc(DEFAULT_CAPACITY*sizeof(ItemT));        

  (stackPtr->top) = -1;
  (stackPtr->capacity) = DEFAULT_CAPACITY;
  (stackPtr->count) = 0;    
  fprintf(stderr, "\nSuccesfully allocated memory to items...\n");

  return stackPtr;
}

现在,我的推送功能是:

void pushStack(StackP stackPtr, ItemT item) {           
  if ((stackPtr->count) == (stackPtr->capacity)) {
    fprintf(stderr, "\nERROR: Full stack.\n");
  }
  else {
    stackPtr->items = item;
    fprintf(stderr, "\nSuccessfully pushed %s on to the stack...\n", stackPtr->items);
    (stackPtr->items)++;
    (stackPtr->top)++;
    (stackPtr->count)++;
  }
}

我的问题是:我在任何这些代码块中都没有出错。

如果我调用的函数说:

return (stackPtr->count);

它将返回一组随机数而不是0或1.例如,如果我将2个字符串推入堆栈,而不是计数为2,则计数为479622或其他一些随机长数。为什么会这样?

同样,我想知道我做错了什么,而不仅仅是正确的语法,因为我真的必须理解这一点。

1 个答案:

答案 0 :(得分:7)

程序具有未定义的行为,因为它从函数返回局部变量的地址:

StackP newStack(void) {
  struct Stack stack1;
  StackP stackPtr = &stack1;

  return stackPtr;
}
退出stack1

newStack不再存在。 stackPtr必须指向动态分配的内存,如果它存在于函数范围之外:

StackP newStack(void) {
  struct Stack stack1;
  StackP stackPtr = malloc(sizeof(*stackPtr));
  if (stackPtr)
  {
  }

  return stackPtr;
}

请参阅Do I cast the result of malloc?