You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两个timeval结构体的tv_sec值相同,相减却得到非零值是什么原因

异常原因及底层逻辑说明

直接原因:printf格式占位符与实际参数类型不匹配,触发未定义行为

  • 你定义的elaspsed_time_s是long int类型,但printf里对应该变量用了%d占位符,%d仅适用于int类型,二者的内存长度在多数64位环境下不一致(int为4字节,long int为8字节)。
  • timeval结构体的tv_sec成员类型是time_t,属于平台相关的整数类型,同样不能直接用%d输出,进一步加重了参数解析的错位。

底层运行逻辑

printf是可变参数函数,编译阶段不会对可变参数的类型做校验,完全依赖格式字符串中的占位符来逐个解析栈上的参数:

当占位符要求的长度和实际参数长度不匹配时,printf会按占位符的长度错误读取栈内存:比如你给%d传了8字节的long int,printf只会读前4字节作为第一个输出值,剩下的4字节会被当成下一个%d的参数内容。你看到的两个tv_sec数值相同、差值却为3的结果完全是参数解析错位导致的异常输出,三个打印值和你实际传入的三个变量的真实值没有对应关系,属于典型的未定义行为。

修复方案

将所有整数参数统一强转为固定长度的长整型,使用匹配的占位符输出即可:

long int elaspsed_time_s  = end_time.tv_sec - Dbg_timer.tv_sec;
printf("elaspsed_time_s =%ld -> end_time_tv_sec=%lld  Dbg_timer_tv_sec=%lld \n", 
        elaspsed_time_s,       (long long)end_time.tv_sec,    (long long)Dbg_timer.tv_sec);

内容的提问来源于stack exchange,提问作者African_king

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 09:48:02