SystemTimeToTzSpecificLocalTime能否复用同一SYSTEMTIME指针作为输入输出?
关于SystemTimeToTzSpecificLocalTime复用输入输出指针的安全性问题
函数原型
BOOL SystemTimeToTzSpecificLocalTime( [in, optional] const TIME_ZONE_INFORMATION *lpTimeZoneInformation, [in] const SYSTEMTIME *lpUniversalTime, [out] LPSYSTEMTIME lpLocalTime );
从静态类型检查角度,第二个(输入)和第三个(输出)参数均为SYSTEMTIME结构体指针,理论上可传入同一指针实现原地修改。你测试中该操作能正常运行且输出结果正确,示例代码如下:
#include <windows.h> void main() { SYSTEMTIME tm; GetSystemTime(&tm); SystemTimeToTzSpecificLocalTime(NULL, &tm, &tm); wprintf(L"Local Time: %02d:%02d:%02d\n", tm.wHour, tm.wMinute, tm.wSecond); }
问题解答
虽然实际测试中复用指针能正常工作,且微软官方文档未明确说明该操作的安全性,但不建议依赖这种未被文档化的行为:
- Windows API的内部实现可能随版本更新调整,当前版本支持原地修改,未来版本可能因计算逻辑变化,出现输入数据被提前覆盖导致的错误。
- 最安全、符合API设计规范的做法是为输出单独创建
SYSTEMTIME结构体,确保输入数据在整个计算过程中保持完整。
安全写法示例:
#include <windows.h> void main() { SYSTEMTIME utcTm, localTm; GetSystemTime(&utcTm); SystemTimeToTzSpecificLocalTime(NULL, &utcTm, &localTm); wprintf(L"Local Time: %02d:%02d:%02d\n", localTm.wHour, localTm.wMinute, localTm.wSecond); }
内容的提问来源于stack exchange,提问作者yg-i
相关产品推荐
相关产品推荐

