DNM_Manager.c
struct DNM_s
{
uint32_t Addr;
uint32_t SerialNum;
uint32_t SubnetMask;
uint16_t Tick;
uint8_t Name[NAME_SIZE];
}DNMTemp;
pDNM DNMManager_New(void) //reentrant?
{
return &DNMTemp;
}
GeeksForGeeks说:要重新输入,该函数不能使用全局和静态数据。
在这种情况下,我确实使用了全局数据“ DNMTemp”。但是,DNMTemp的值不会更改,函数只会返回其地址。
答案 0 :(得分:2)
是的
摘自reentrancy的标签摘录:
如果可以在以前的调用完成之前安全地调用该子例程,则该子例程被视为可重入。
在您的情况下,由于该函数仅返回全局(静态)变量的地址(在程序启动后应保持不变),因此该函数可以重入。
IMO,可重入函数 可以访问全局和静态数据,而无需更改任何内容,因此获取可重入函数的全局变量地址并不坏。 / p>
答案 1 :(得分:1)
在考虑函数是否可重入时,该示例必须比该示例平凡一些。
pDNM DNMManager_New(void) //reentrant?
{
return &DNMTemp;
}
但是在程序执行过程中对DNMTemp
(其地址)的引用将保持不变,因此该函数是可重入的。
但是,如果您访问任何真实数据,则不会。
uint32_t DNMManager_read(void) //reentrant?
{
return SerialNum;
}