擦除一个简单的节点并通过引用或值传递一个节点来运行
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
希望对您有所帮助!
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
希望对您有所帮助!