数据结构:当我尝试将数据从堆栈中弹出时,我的程序崩溃

时间:2017-02-12 15:43:58

标签: c pointers

我正在进行专注于堆栈的数据结构分配,我需要帮助。 如果它们是使用堆栈的回文,我应该比较两个字符串。

我对这个程序的想法是fgets()一个字符串。清除空格并将其存储在char" o"然后将每个字符串推入一个堆栈,将它们弹出到另一组char" r"并检查是否(o == r)。

然而,当我编译时,我得到一个警告,该程序正常工作。 进一步深入到我的程序中,当我尝试弹回我的字符时,程序崩溃。

我很好奇是什么原因导致我的代码中的警告以及如何修复它。 最重要的是,我希望了解当我将数据从satck中弹出时导致程序崩溃的错误。

警告:

main.c:28:17: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
       dataPtr = (char*)s[c];

崩溃时的结果:

Segmentation fault (core dumped)

我附加的代码:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include "stacksADT.h"

int main (void)
{
  char s[50];
  char o[50];
  char r[50];

  STACK* stack;
  char* dataPtr;

  stack = createStack();

  printf("Enter the string to compare:\n");
  fgets(s,50, stdin);

  for(int c = 0; c < strlen(s); c++){
    if( s[c] != ' ' ){
      dataPtr = (char*)s[c];
      printf("%s", dataPtr);
      pushStack( stack, dataPtr );
    }
  }

  for(int c = 0; c < strlen(o); c++){
    printf("%s", (char*)popStack(stack));
  }

} // main

我的popStack()操作:

void* popStack (STACK* stack)
{
  // Local Definitions
  void* dataOutPtr;
  STACK_NODE* temp;

  // Statements
  if(stack->count == 0)
    dataOutPtr = NULL;
  else
  {
    temp = stack->top;
    dataOutPtr = stack->top->dataPtr;
    stack->top = stack->top->link;
    free(temp);
    (stack->count)--;
  } // else
  return dataOutPtr;
} // popStack

1 个答案:

答案 0 :(得分:3)

s[c]返回一个字符。你只需将它转换为指针。分配指针char *dataPtr是错误的,您需要传递一个引用。使用以下两种方法之一:

  • dataPtr = &(s[c])
  • dataPtr = s+c