比较深刻了解了C语言中free()后垃圾指针的处理,对于垃圾指针的调试真是非常的困难。下面附上个人代码
#include <stdio.h> #include <stdlib.h> #define FALSE 0 #define TRUE 1 #define eletype int typedef struct node { eletype data; node *down; } NODE; typedef struct stack { NODE *top; int size; } STACK; STACK *initStack() { STACK *p = (STACK *)malloc(sizeof(STACK)); if (p != NULL) { p->top = NULL; p->size = 0; } return p; } int isEmpty(STACK *p) { if (p->top == NULL && p->size == 0) { return TRUE; } else { return FALSE; } } NODE *getTop(STACK *p, eletype *dataPonter) { if (!isEmpty(p) && dataPonter != NULL) { *dataPonter = p->top->data; } return p->top; } NODE *push(STACK *p, eletype data) { NODE *newNode = (NODE *)malloc(sizeof(NODE)); if (newNode != NULL) { newNode->data = data; newNode->down = getTop(p, NULL); p->size++; p->top = newNode; } return newNode; } NODE *pop(STACK *p, eletype *dataPointer) { if (!isEmpty(p)) { NODE *tmpTop = p->top; if (dataPointer != NULL) { *dataPointer = p->top->data; } p->top = p->top->down; free(tmpTop); p->size--; } return p->top; } void clearStack(STACK *p) { while (isEmpty(p) != TRUE) { pop(p, NULL); } } void destroyStack(STACK *p) { if (!isEmpty(p)) { clearStack(p); } free(p->top); free(p); p->top = NULL;//此处在free后的top并不是NULL,需要手动置空,此处的调试很麻烦 } int main() { STACK *sp = initStack(); for (int i = 1; i <= 5; i++) { push(sp, i); } while (!isEmpty(sp)) { int t = 0; pop(sp, &t); printf("stack top is %d\n", t); } return 0; }