我有一段代码可以做到这么简单。
static Log_t* point2logEntry = NULL;
void function1(void)
{
....
point2logEntry->Member1 = 1;
point2logEntry->Member2 = Member1 + 1; //Member2 will be equal to 2
point2logEntry->Member3 = Member1 + 2; //Member2 will be equal to 3
...
}
现在points2logEntry
包含一些数据的地址。
void Function2(void)
{
Log_t* points2Log;
function1();
points2log->Member1 = 4;
points2log->Member2 = 5;
points2log->Member3 = 6;
point2logEntry = points2log;
/* At this point, the compiler/debugger window shows the memory address of the 2 pointers are one and the same. Shadowed and the watch window shows.
point2logEntry->Member1 //Member2 will be equal to 4
point2logEntry->Member2 //Member2 will be equal to 5
point2logEntry->Member3 //Member2 will be equal to 6
*/
}
现在point2logEntry = points2log;
这已在Function2
中设置,Function2
拨打Function1
。
在Function3
下方
void Function3(void)
{
...
Function2(); //see Question1 below
}
我在观看窗口中看到的是points2log
的地址被镜像/隐藏到point2logEntry
。
问题1)由于points2log
中的function2
是一个自动变量,但其地址被隐藏为静态范围指针point2logEntry
。执行function2
后,point2logEntry
的成员是否仍会拥有最新数据?
问题2)何时以及为什么要这样做(镜像内存地址)?这样做有什么好处,还是程序员偏好。
我的理解:您基本上可以使用points2logEntry
满足您的所有function2
需求(因为静态生命周期),但在这种情况下程序员家伙以这种方式使用。事实上,当function2
从堆栈“弹出”时,自动变量Log_t* points2Log;
消失,数据不再可用。但是地址被传递到point2logEntry
,并且在function2
的范围到期后,地址将永远丢失。