我正在尝试使用指针实现堆栈,结构定义在下面的代码中。我为push()
函数调用了三个元素(比如:2,4,6)来插入。然后,我调用函数display()
。它仅显示0
。我找出原因是因为free()
函数中的push()
函数。但是,我不知道那里到底发生了什么。我是否应该使用free()
释放代码中temp
使用的已分配内存?如果是这样,为什么?
#include<stdio.h>
//#include<unistd.h>
#include<stdlib.h> // malloc ,calloc, free avail here
void push();
void pop();
void display();
struct stack {
int data;
struct stack *next;
};
struct stack *start = NULL;
void push()
{
int ele;
struct stack *temp, *p;
printf("entere the element\n");
scanf("%d", &ele);
temp = (struct stack *) malloc(sizeof(struct stack));
temp->data = ele;
if (start == NULL) {
start = temp;
start->next = NULL;
} else {
p = start;
while (p->next != NULL) {
p = p->next;
}
p->next = temp;
temp->next = NULL;
}
free(temp);
}
答案 0 :(得分:1)
void push(){
int ele;
struct stack *temp,*p;
printf("entere the element\n");
scanf("%d",&ele);
temp=(struct stack *)malloc(sizeof(struct stack ));
temp->data=ele;
if(start==NULL){
start=temp;
start->next=NULL;
}
else{
p=start;
while(p->next !=NULL){
p=p->next;
}
p->next=temp;
temp->next=NULL;
}
free(temp); // don't free temp here !
}
只有在你不再需要时才需要释放指针。您可以认为是这种情况,因为您不使用temp
,但事实并非如此。 free
的参数是有效的内存地址。 temp
是有效的内存地址,但您要将temp
分配给start
!因此:free(tmp)
与free(start)
相同,而这不是您想要的。