我的类(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/