我还在学习C语言。我有一个问题是模拟一个简单的堆栈函数,如push,pop等。我发现{PALIL中未初始化date
和next
。那时,程序结束了。这是否算作内存泄漏?
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct Node{
int date;
struct Node * next;
}Node,*PNode;
typedef struct Stack{
PNode pHead;
PNode pTail;
}Stack;
void init(Stack *pS){
PNode n=(PNode)malloc(sizeof(Node));
pS->pHead=n;
pS->pTail=n;
n->next=NULL;
}
void push(Stack *pS,int val){
PNode p=(PNode)malloc(sizeof(Node));
p->date=val;
p->next=pS->pHead;
pS->pHead=p;
}
void travel(Stack *pS){
PNode p=pS->pHead;
while(p->next){
printf("%d ",p->date);
p=p->next;
}
printf("\n");
}
int main(void){
Stack s;
init(&s);
push(&s,1);
travel(&s);
push(&s,1);
travel(&s);
system("pause");
return 0;
}
答案 0 :(得分:1)
每个malloc
都应与free()
配对。你没有写/显示你的pop()
函数,但那就是这个地方。如果没有释放内存缓冲区/对象,那么就是内存泄漏。
您在Init()
m中分配了一个不需要的空第一项。
答案 1 :(得分:0)
您在init
上分配了不必要的节点。更重要的是,您没有初始化date
成员。删除节点创建:
void init(Stack *pS) {
pS->pHead = NULL;
pS->pTail = NULL;
}
push
上无需投标。
PNode p = malloc(sizeof(Node));
即使travel
可以是p->next
,您的p
功能也会检查NULL
。更改while
测试:
void travel(Stack *pS) {
PNode p = pS->pHead;
while(p) {
printf("%d ", p->date);
p = p->next;
}
printf("\n");
}