擦除一个简单的节点并通过引用传递或估计一个节点的功能

时间:2015-01-24 00:08:39

标签: c memory malloc

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修改了测试节点中的数据值,所以都是通过引用传递的?在这种情况下你如何通过价值传递?

1 个答案:

答案 0 :(得分:3)

我会尽量让它变得简单,让我们假设这是我们的记忆

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

所以在执行malloc()之后,你要求系统给你空间,以便用它来存储一个5个整数的表

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

因此,您可以在拥有该权限的情况下对该空间执行任何操作: 您可以在其中存储值,修改它们等。

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

当你释放该空间时,它会返回系统,那时你没有权利使用它

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

您正在做的是访问一个您不被允许的记忆案例非法

所以当你不被允许访问空间时,释放空间以将指向空间的指针设置为NULL

是一个好习惯

此外,如果你获得它后没有释放空间,这将导致所谓的内存泄漏

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

例如

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

所以当调用像function(p)这样的函数时:p按值传递,但a是通过引用传递的,因为p保持其地址就好像它是{{ 1}}

function(&a)的任何修改都是永久性的,但不适用于a,因为修改只在函数块中生效,之后才会被丢弃!

我们总结了

在调用该函数之前,我们p指向pa ----&gt; p

a

在函数调用期间,将创建p------------->a 的副本,让我们将其称为 p',后者将在执行期间取代p功能(这就是为什么p不会发生的原因)

p

通话结束后,副本 p'将被删除

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

希望它有所帮助!