找回密码
 立即注册
查看: 1583|回复: 2

请教一个再入函数的问题,我的形参使用了结构指针,会有问题吗?

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:406
  • 最近打卡:2026-07-03 11:52:41

28

主题

187

回帖

294

积分

中级会员

积分
294
发表于 2023-10-14 11:52:58 | 显示全部楼层 |阅读模式
正常的书本介绍是不能使用全局或者静态变量,形参使用指针是不是也算全局变量呢,这个时候形参的传入应该是堆栈保护的吧?

比如这样


BOOL fEmptyQueue_BYTE(QUEUE_BYTE_TypeDef *sQueue) reentrant {
  
  return  sQueue->bhQlength == 0 ? TRUE : FAIL;
}  


BOOL fFullQueue_BYTE(QUEUE_BYTE_TypeDef *sQueue) reentrant {

  return sQueue->bhQlength == sQueue->bhMaxSize ? TRUE : FAIL;
}

找不到合适版块来请教这个问题,不合适请移送相关版块。
回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2026-06-04 10:45:04

173

主题

1354

回帖

5253

积分

荣誉版主

积分
5253
发表于 2023-10-14 12:34:51 | 显示全部楼层
(1)对于C251/C51,一个函数声明了函数重入“reentrant”后,形参就不是全局变量了,每次调用都会在函数堆栈中分配新地址空间,受到函数重入保护的。
(2)针对你的
具体例子而言,形参是一个指针(不是结构本身!),不是全局变量,每次调用分配4字节/3字节的新堆栈空间。
(3)但是函数调用时形参指针指向的结构必须是一个可访问实体结构,这个实体结构通常是一个全局结构变量、上层函数的结构变量或者是一个已经指向实体结构的指针。只有这样函数的操作才能针对一个具体的实体完成。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:406
  • 最近打卡:2026-07-03 11:52:41

28

主题

187

回帖

294

积分

中级会员

积分
294
发表于 2023-10-14 12:45:11 | 显示全部楼层
杨*** 发表于 2023-10-14 12:34
(1)对于C251/C51,一个函数声明了函数重入“reentrant”后,形参就不是全局变量了,每次调用都会在函数堆 ...

“(3)但是函数调用时形参指针指向的结构必须是一个可访问实体结构,这个实体结构通常是一个全局结构变量、上层函数的结构变量或者是一个已经指向实体结构的指针。只有这样函数的操作才能针对一个具体的实体完成。”

谢谢杨老师,其实就担心这些,以前队列用的很多,不用应用模块直接copy异名函数,现在觉得挺麻烦的。
很多结构相同的实体,每个实体都是几十上百个成员,具体估计还是需要看编译器的处理,从C语言本身来说这样的访问又似乎没有问题,毕竟只要KEIL再入时用的模拟堆栈保护形参指针应该就可以了。
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-7-5 14:13 , Processed in 0.067115 second(s), 48 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表