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

Fra*_*ani 0 c stack push peek

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

typedef struct Stack *StackP;

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

struct Stack
{
  int top;
  int capacity;
  int count;
  ItemT items;
};
Run Code Online (Sandbox Code Playgroud)

在哪里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;
}
Run Code Online (Sandbox Code Playgroud)

现在,我的推送功能是:

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)++;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

如果我调用一个函数说:

return (stackPtr->count);

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

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

hmj*_*mjd 7

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

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

  return stackPtr;
}
Run Code Online (Sandbox Code Playgroud)

stack1newStack退出时不再存在.stackPtr必须指向动态分配的内存,如果它超出函数的范围:

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

  return stackPtr;
}
Run Code Online (Sandbox Code Playgroud)

请参阅我是否转换了malloc的结果?