c - 链接堆栈未链接?

标签 c memory-management stack

我的类(class)被分配了 c 中的堆栈实现。出于某种被遗忘的原因,当我插入堆栈然后一次将它们弹出时,它只会在停止前弹出一个。 Valgrind 告诉我这是由于内存问题,但我似乎无法查明。

堆栈.c

#include <stdlib.h>
#include "stackNode.h"
#include "stack.h"

void push(StackNode** stack, char* data) {
  StackNode* temp = makeStackNode(data, *stack);
  *stack = temp;
}

char* top(StackNode* stack) {
  if(emptyStack(stack) == 0) {
    return stack->data;
  }
  exit(EXIT_FAILURE);
}

void pop(StackNode** stack) {
  if(emptyStack(*stack) == 0) {
    StackNode* tmp = *stack;
    *stack = (*stack)->next;
    free(tmp->data);
    free(tmp);
  }
  exit(EXIT_FAILURE);
}

int emptyStack(StackNode* stack) {
   if (stack == NULL) {
     return 1;
   }
  return 0;
}

堆栈节点.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "stackNode.h"

StackNode* makeStackNode(char* data, StackNode* next) {
  StackNode* res = malloc(sizeof(StackNode));
  res->data = malloc(strlen(data) + 1);
  strcpy(res->data, data);
  res->next = next;
  return res;
} 

主.c

#include "interp.h"
#include "stackNode.h"
#include "stack.h"

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char* argv[]) {
  StackNode* stack = NULL;
  push(&stack, "A");
  push(&stack, "B");
  push(&stack, "C");
  while(emptyStack(stack) == 0) {
    char* tk = top(stack);
    printf("%s\n", tk);
    pop(&stack); 
  } 
  return EXIT_SUCCESS;
}

验证

==17494== HEAP SUMMARY:
==17494==     in use at exit: 36 bytes in 4 blocks
==17494==   total heap usage: 6 allocs, 2 frees, 54 bytes allocated
==17494==
==17494== 2 bytes in 1 blocks are still reachable in loss record 1 of 4
==17494==    at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==17494==    by 0x400C4D: makeStackNode (stackNode.c:9)
==17494==    by 0x400B57: push (stack.c:6)
==17494==    by 0x4007C4: main (interp.c:10)
==17494==
==17494== 2 bytes in 1 blocks are still reachable in loss record 2 of 4
==17494==    at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==17494==    by 0x400C4D: makeStackNode (stackNode.c:9)
==17494==    by 0x400B57: push (stack.c:6)
==17494==    by 0x4007D5: main (interp.c:11)
==17494==
==17494== 16 bytes in 1 blocks are still reachable in loss record 3 of 4
==17494==    at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==17494==    by 0x400C31: makeStackNode (stackNode.c:8)
==17494==    by 0x400B57: push (stack.c:6)
==17494==    by 0x4007C4: main (interp.c:10)
==17494==
==17494== 16 bytes in 1 blocks are still reachable in loss record 4 of 4
==17494==    at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==17494==    by 0x400C31: makeStackNode (stackNode.c:8)
==17494==    by 0x400B57: push (stack.c:6)
==17494==    by 0x4007D5: main (interp.c:11)
==17494==
==17494== LEAK SUMMARY:
==17494==    definitely lost: 0 bytes in 0 blocks
==17494==    indirectly lost: 0 bytes in 0 blocks
==17494==      possibly lost: 0 bytes in 0 blocks
==17494==    still reachable: 36 bytes in 4 blocks
==17494==         suppressed: 0 bytes in 0 blocks

最佳答案

您忘记从函数 pop() 返回,即使节点有效,程序也退出了。

void pop(StackNode** stack) {
  if(emptyStack(*stack) == 0) {
    StackNode* tmp = *stack;
    *stack = (*stack)->next;
    free(tmp->data);
    free(tmp);
    return; /* add this */
  }
  exit(EXIT_FAILURE);
}

关于c - 链接堆栈未链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36026184/

相关文章:

c - 为什么交换二叉树节点时 GDB 观察点会停在不相关的行上?

c++ - 万无一失的配置方式#define/#ifdef

c - 如果请求的内存空间很大,Malloc 是否只使用堆?

objective-c - Objective C 中存在内存问题的 C 数组

memory-management - SystemCache 和 MemoryInUse - 谁能解释这种行为?

c - 如何使用 MonoDevelop 进行 C 编码?

c - 使用宏打印多个变量

c - 释放用 C 实现的堆栈

language-agnostic - 在任何情况下我都想在递归上使用显式堆栈吗?

c++ - 嵌入式 C++,有什么技巧可以避免仅用于返回堆栈上的值的局部变量吗?