从堆栈内存中删除struct

时间:2014-03-04 17:43:50

标签: c memory struct null stack

我有一个链表结构,我想将一个节点(另一个结构)指针传递给一个函数(该节点是链表的一部分,但我将该节点单独传递给删除函数

我希望它将下一个节点数据复制到自身(覆盖其数据),并删除下一个节点,从而删除自身(此部分正在工作).. 我检查了传递的节点是否是列表中的最后一个节点,如果是,则删除自身。

我不知道如何从堆栈中删除结构(我知道我可以使用堆内存来malloc()和free())。

#include <stdlib.h>
#include <stdio.h>

typedef struct {
    int data;
    struct node * next;
}node;

typedef struct {
    struct node * head;
}linked_list;

void print_list(linked_list * list) {

    node *current = list->head;
    while (current) {
        printf("Current node has %d\n",current->data);
        current = current->next;
    }
}

void delete_node(node * n) {
    node * next = n->next;
    if (next) {
        n->data = next->data;
        n->next = next->next;
    }
    else {
        *n =  NULL; /*This of course won't compile because assigning void* (null) to node variable
                              but if i make n point to NULL, nothing will happen because i'm inside a function
                              and the pointer is duplicated (the passed pointer will still work) */
    }
}

void main(){
    node first;
    node second;
    first.data = 1;
    first.next = &second;
    second.data = 2;
    second.next = NULL;
    linked_list l;
    l.head = &first;
    print_list(&l);
    delete_node(&second);
    print_list(&l);
}

2 个答案:

答案 0 :(得分:1)

正如其他人所说,你不能

如果您希望能够在列表中存储已分配的(通过malloc)和未分配的(静态或自动)存储对象,并具有“删除”功能,可从列表中删除对象并释放它们,你需要存储一个标志,作为每个列表成员的一部分,指示它是否在分配的存储中,并且只释放它们。

另请注意,如果自动存储结构的生命周期在您从列表中删除之前结束,那么您将遇到大麻烦!如果处理这个问题对你来说很困惑,那么你可能会为所有列表成员使用分配的存储空间(malloc)做得更好。

答案 1 :(得分:0)

你不能:)

在大多数计算机体系结构中,局部变量直接分配在CPU寄存器或堆栈上。对于在堆栈上分配的局部变量,当函数进入时,操作堆栈的顶部(用于保存函数调用的返回地址的相同堆栈)为它们腾出空间,并且它被恢复为“释放”函数退出时的内存。所有这些堆栈管理都由编译器自动处理。