【问题标题】:Properly Reading a Char from an Int in C on a Stack正确从堆栈上的 C 中的 Int 读取字符
【发布时间】:2010-09-14 19:47:51
【问题描述】:

所以我现在正疯狂地从堆栈中读取字符。我将 char 存储为 int,所以我可以检查 EOF 信号,但事情进展不顺利。我是堆栈实现的新手,所以某些地方可能只是错误的。这是我的代码。

我在堆栈上得到了不正确的顶部字符(它显示 -1,它是 EOF,而不是输入的最后一个字符),以及某种内存错误 - “未分配被释放的指针” ,它引用了 destroyStack() 函数。

int main( void ) { int *letter; STACK *stack; stack = createStack(); letter = (int *) malloc( sizeof( int ) ); printf("Please enter the letters, each on a new line, or to quit:\n"); while ( *letter != EOF || stackFull( stack ) ) { *letter = getchar(); if ( *letter != '\n' && *letter != ' ' && *letter != EOF ) { printf("Adding %c to the stack.\n", *letter); pushStack( stack, letter ); } } free( letter ); printf("Stack count is %i\n", stackCount(stack)); letter = (int *) getStackTop( stack ); printf("The top char is %i\n", *letter); destroyStack( stack ); return 0; }

和我的堆栈代码:

typedef struct node { void *dataPointer; struct node *link; } NODE; typedef struct { int count; NODE *top; } STACK; STACK* createStack() { STACK *stack; stack = (STACK *) malloc( sizeof( STACK ) ); if ( stack ) { stack->count = 0; stack->top = NULL; } return stack; } bool pushStack( STACK *stack, void *pointerToData) { NODE *newNode; newNode = (NODE *) malloc( sizeof( NODE ) ); if ( !newNode ) { return false; } newNode->dataPointer = pointerToData; newNode->link = stack->top; stack->top = newNode; ( stack->count )++; return true; } void* popStack( STACK *stack ) { void* topData; NODE* temp; if ( stack->count == 0 ) { topData = NULL; } else { temp = stack->top; topData = stack->top->dataPointer; stack->top = stack->top->link; free( temp ); ( stack->count )--; } return topData; } void* getStackTop( STACK *stack ) { if ( stack->count == 0 ) { return NULL; } else { return stack->top->dataPointer; } } bool stackEmpty( STACK *stack ) { return ( stack->count == 0 ); } bool stackFull( STACK *stack ) { NODE *temp; if ( ( temp = (NODE *) malloc( sizeof( *(stack->top) ) ) ) ) { free( temp ); return false; } return true; } int stackCount( STACK *stack ) { return ( stack->count ); } STACK* destroyStack( STACK *stack ) { NODE *temp; if ( stack ) { while ( stack->top != NULL ) { free( stack->top->dataPointer ); temp = stack->top; stack->top = stack->top->link; free( temp ); } free( stack ); } return NULL; }

【问题讨论】:

  • 要格式化代码,在每行之前使用四个空格。您还可以按下一个按钮,为您完成此操作。
  • 是的,我错过了
     标签,它弄乱了我的格式。我搞定了。
  • 是的。堆栈函数在正文中提供给我,我将使用堆栈进行赋值。这是我第一次使用堆栈,虽然我了解了所有概念,但我不明白为什么 destroyStack() 调用会引发错误,我也不明白当我从顶部阅读时出了什么问题堆栈。我正在阻止空格、换行符和文件结尾字符被扔到堆栈上。

标签: c stack char


【解决方案1】:

你的问题是字母。它只分配一次,当你将它压入堆栈时,它不会复制。这就是为什么您的顶部数据指针始终是您推送的最后一件事。然后你释放它,destroyStack 释放它,你得到另一个错误。由于堆栈函数来自您的分配,因此修复方法是在每次迭代时在循环内分配一个新的数据指针,并确保它不会在 destroyStack 之外释放。

【讨论】:

  • 就是这样。我在那里有 free( letter ) 来释放内存,然后让指针用于显示堆栈中的顶部数据点。我什至没有想到我在很多地方重复使用同一块内存,然后销毁它并试图从中读取。谢谢!
【解决方案2】:

嗯。 . .看起来您正在双重释放数据指针:

pushStack( stack, letter );
...
free( letter );
...
free( stack->top->dataPointer ); //(in destroyStack)

所以,我将首先删除 free( letter ) 行。

【讨论】:

  • 这行不通,因为堆栈的每个元素仍然会以 dataPointer 引用相同的地址结束。当试图释放第二个元素的dataPtr 并且只为堆栈的所有元素存储一个值时,它仍然会崩溃。
【解决方案3】:

看看你分配了多少 int 大小的内存。我认为您需要为压入堆栈的每个条目分配一个新条目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 2018-02-07
    • 2020-12-04
    • 2018-05-19
    • 2013-02-16
    相关资源
    最近更新 更多