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

C语言times()函数是否不会覆盖传入的struct tms参数?

问题根源:值传递导致外部变量未更新

你猜的没错!问题就出在函数参数的传递方式上——你的get_clock用的是值传递,函数内部修改的只是参数的临时副本,根本不会影响到你在外面定义的st_time、en_time这些变量,所以后续测量的差值自然都一样。

具体分析原函数的问题

看一下你写的函数:

void get_clock(clock_t real_time, struct tms cpu_time){ 
    real_time = times(&cpu_time); 
}

这里的real_time和cpu_time都是形参,它们是调用函数时传入的实参的一份拷贝。当你在函数里给real_time赋值时,只是修改了这个拷贝的值,函数执行完毕后,这个拷贝就被销毁了,外面的st_time、st_cpu完全没被改动。这就导致每次调用get_clock后,你的起始/结束时间变量都还是初始值,差值当然不会变化。

两种修复方案

方案1:使用指针传递参数

把函数改成接受指针类型的参数,这样就能直接修改外部变量的内存值:

#include <sys/times.h> // 确保包含头文件

void get_clock(clock_t *real_time, struct tms *cpu_time){
    // 通过指针访问并修改外部变量
    *real_time = times(cpu_time);
}

调用的时候需要传递变量的地址:

clock_t st_time;
clock_t en_time;
struct tms st_cpu;
struct tms en_cpu;

// 记录起始时间
get_clock(&st_time, &st_cpu);
// 执行你需要测量的代码...
// 记录结束时间
get_clock(&en_time, &en_cpu);

方案2:返回clock_t值(更简洁)

如果觉得指针有点繁琐,可以让函数直接返回times()的结果,同时用指针传递struct tms:

#include <sys/times.h>

clock_t get_clock(struct tms *cpu_time){
    return times(cpu_time);
}

调用方式更直观:

st_time = get_clock(&st_cpu);
// 执行代码...
en_time = get_clock(&en_cpu);

补充:计算时间差值

拿到起始和结束时间后,你可以这样计算实际耗时:

#include <unistd.h> // 用于sysconf

// 真实时间差(时钟滴答数)
clock_t real_diff = en_time - st_time;
// 用户态CPU时间差
clock_t usr_diff = en_cpu.tms_utime - st_cpu.tms_utime;
// 内核态CPU时间差
clock_t sys_diff = en_cpu.tms_stime - st_cpu.tms_stime;

// 转换为秒(_SC_CLK_TCK是每秒的时钟滴答数)
double real_sec = (double)real_diff / sysconf(_SC_CLK_TCK);
double usr_sec = (double)usr_diff / sysconf(_SC_CLK_TCK);
double sys_sec = (double)sys_diff / sysconf(_SC_CLK_TCK);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:33:40