关于c中的自由(指针)的混淆

时间:2013-07-23 19:09:14

标签: c pointers memory memory-leaks segmentation-fault

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

1 个答案:

答案 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)相同,而这不是您想要的。