两个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
相关产品推荐
相关产品推荐

