擦除一个简单的节点并通过引用或值传递一个节点来运行

erase a simple node and pass by reference or value a node to function

typedef struct node{
    int data;
}NODE;


void erasenode (NODE** lista){
    free(*lista);
}
int main() {
    NODE* test;
    test = (NODE*) malloc(sizeof(NODE));
    test->data = 5;
    printf("%d\n",test->data); //1
    erasenode(&test);
    printf("%d\n",test->data); //1
    return 0;
}

(1) 打印 5

(2) 仍在打印 5

为什么会这样?我没有释放内存?或者当您释放指针时,数据仍在内存中,但内存已经空闲供以后使用?

在这一个中:

typedef struct node{
    int data;
}NODE;
void makenode (NODE* node){
    node -> date = 5;
}
void makenode2 (NODE** node){
    (*node) -> date = 10;
}
int main() {
    NODE* test;
    test = (NODE*) malloc(sizeof(NODE));
    makenode2(&test);
    printf("%d\n",test->data);
    makenode(test);
    printf("%d\n",test->data);
    return 0;
}

makenode和makenode2修改了test节点data的值,所以都是引用传递?在这种情况下你如何传递价值?

我会尽量简化让我们假设这是我们的记忆

-------------------------------------------------
|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  
-------------------------------------------------

所以在执行 malloc() 之后你要求系​​统给你 space 以便使用它来存储一个 table 的 5 个整数

            pointer to the space that you have requested
                V
-------------------------------------------------
|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  
-------------------------------------------------
                <------------->
                  The space you are allowed to use it and modify it 

所以你可以用那个 space 做任何事情,因为你有特权: 您可以在其中存储值、修改它们等。

            pointer to your space given
                V
-------------------------------------------------
|  |  |  |  |  |5 |2 |25|1 |44|  |  |  |  |  |  |  
-------------------------------------------------
                <------------->
                  The space allowed to use it and modify it 

当您将 space 释放到系统时 returns 而那时您无权使用它

            pointer to your space which is not now owned by you anymore
                V
-------------------------------------------------
|  |  |  |  |  |5 |2 |25|1 |44|  |  |  |  |  |  |  
-------------------------------------------------

你正在做的是访问你不允许的内存情况,这是非法

因为不允许访问space,释放space后将指向space的指针设置为[=19=是个好习惯]

此外,如果您在获得 space 后不释放它,这将导致所谓的 内存泄漏

关于你的最后一个问题: 任何作为函数参数传递的变量本身都是按值传递的,即使是数组名也是如此,但如果它是一个指针,它指向的变量是通过引用传递的

例如

int function(int* x);
int a=0;
int *p=&a;

所以当像这样调用函数时 function(p)p 是按值传递的,而 a 是按引用传递的,因为 p 持有它的地址,就好像它是function(&a)

a 的任何修改将是永久性的,但对 p 则不是,因为修改仅在函数块期间生效,之后将被丢弃!

我们总结一下

在调用函数之前我们有 p 指向 a (p---->a)

p------------->a

在函数调用期间,将创建一个 p 的副本,我们称它为 p',后者将取代 p在函数执行期间(这就是为什么 p 什么也不会发生的原因)

p ------------->a<----------p'

调用后,副本p'将被删除

p ------------->a             

希望对您有所帮助!