gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:11:25 27 4
gpt4 key购买 nike

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() 之后,您要求系统给您空间,以便使用它来存储 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 保存它的地址,就好像它是 function(&a)

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

我们总结

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

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

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

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

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

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

希望对您有所帮助!

关于c - 删除一个简单的节点并通过引用或值传递一个节点来运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28120785/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com