C语言 从堆栈内存中删除结构



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

我希望它将下一个节点数据复制到自身(

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

我不知道如何从堆栈中删除结构(我知道我可以使用堆内存 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 %dn",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);
}

正如其他人所说,你不能

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

另请注意,如果在从列表中删除具有自动存储的结构的生命周期结束,您将遇到大麻烦!如果处理这个问题对您来说完全令人困惑,那么您可能最好为所有列表成员使用分配的存储(malloc)。

你不能

:)

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

您可以使用"free"运算符来释放/删除内存中分配的malloc对象。为此,您可以在代码中编写:

free(n);

相关内容

  • 没有找到相关文章

最新更新