[英]Returning pointer from function and saving it
我在调用函数之前和之后在main中打印了e.val的值,并且该值已更改。 我是C语言的新手,所以想更好地理解这一点。
由于我返回了新的指针并将其分配回e.val,因此e.val的值会更改。
问题:
1)返回并将新值分配给e.val与将双指针传递给e.val基本相同吗?
#include <stdio.h>
#include <stdlib.h>
typedef struct{
int * val;
} Event;
//qdsp_classic
int* function(int * ptr);
int* function2();
int main()
{
Event e;
int x = 10;
e.val = &x;
printf("orig%p\n", (void *) (e.val));
e.val = function(e.val);
printf("New%p\n", (void *) (e.val));
return 0;
}
int* function(int * ptr)
{
ptr = function2();
printf("%p\n", (void *) ptr);
return ptr;
}
int* function2()
int num = 100;
int * newPtr = (int *) malloc(sizeof(int));
return newPtr;
}
如果创建struct Event
实例,则将其分配在堆栈上,并且内部的指针具有立即值->解引用将导致未定义的行为。 变量x
也在堆栈上,值10
。
+-------------+
| |
| +---+ | +----+
| | * | | | 10 |
| +---+ | +----+
| int* val | x
+-------------+
Event e
赋值后e.val = &x;
指针val
是变量x
保存地址(换句话说, val
指向x
)
+-------------+
| |
| +---+ | +----+
| | * |----|------------------>| 10 |
| +---+ | +----+
| int* val | x
+-------------+
Event e
int * newPtr = (int *) malloc(sizeof(int));
在heap
/ 动态存储持续时间上创建一个int
,该持续时间未初始化,并且其地址(第一个字节的地址)保存到指针变量newPtr
。
+-------------+ HEAP
| | ----------------
| +---+ | +----+ +---+
| | * |----|------------------>| 10 | | ? |
| +---+ | +----+ +---+
| int* val | x ^
+-------------+ |
Event e |
|
+---+ |
| * |--------------------------------------------
+---+
int* newPtr
返回newPtr
并将其保存到e.val.
这意味着e.val
不再指向x
而是从现在开始指向堆上的int
。
+-------------+ HEAP
| | ----------------
| +---+ | +----+ +---+
| | * |----|------- | 10 | | ? |
| +---+ | | +----+ +---+
| int* val | | x ^
+-------------+ | |
Event e ---------------------------------
还可以通过传递**
double指针来更改指针指向的位置。
void function(int ** ptr)
{
*ptr = function2();
printf("%p\n", (void *) *ptr);
}
// In main
function(&e.val);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.