我在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;
}
答案 0 :(得分:3)
如果你创建了struct Event
的实例,那么它在堆栈和指针内部的分配有立即值 - &gt;解除引用会导致未定义的行为。变量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));
在int
/ 动态存储时间上创建一个heap
,这是未初始化的,他的地址(第一个字节的地址)保存到指针变量newPtr
。
+-------------+ HEAP
| | ----------------
| +---+ | +----+ +---+
| | * |----|------------------>| 10 | | ? |
| +---+ | +----+ +---+
| int* val | x ^
+-------------+ |
Event e |
|
+---+ |
| * |--------------------------------------------
+---+
int* newPtr
newPtr
会被返回并保存到e.val.
,这意味着e.val
不再指向x
,但现在指向堆上的int
+-------------+ HEAP
| | ----------------
| +---+ | +----+ +---+
| | * |----|------- | 10 | | ? |
| +---+ | | +----+ +---+
| int* val | | x ^
+-------------+ | |
Event e ---------------------------------
也可以通过传递**
双指针来改变指针指向的位置。
void function(int ** ptr)
{
*ptr = function2();
printf("%p\n", (void *) *ptr);
}
// In main
function(&e.val);