0

我正在尝试使用指针实现堆栈,结构定义在下面的代码中。我调用了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);
}
4

1 回答 1

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是一个有效的内存地址,但你分配tempstart! 所以 :free(tmp)是一样的free(start),这不是你想要的。

于 2013-07-23T19:15:30.080 回答