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

在C语言time()函数中使用NULL与普通指针的差异解析

关于C语言time()函数传入NULL与未初始化指针的区别

第一段程序

#include <stdio.h>
#include <time.h>
 
int main ()
{
    time_t seconds;
     
    seconds = time(NULL);
    printf("Hours since January 1, 1970 = %ld\n", seconds/3600);
     
    return(0);
}

输出结果:

Hours since January 1, 1970 = 460587

修改后的程序

#include <stdio.h>
#include <time.h>
 
int main ()
{
    time_t seconds;
    time_t *s;
    seconds = time(s);
    printf("Hours since January 1, 1970 = %ld\n", seconds/3600);
     
    return(0);
}

输出结果:

Hours since January 1, 1970 = 460587

问题

调用time()函数时,使用NULL与使用指针变量s的区别是什么?


回答

先明确time()函数的标准定义:它的原型是time_t time(time_t *timer),核心行为分两种情况:

  • 传入NULL时,函数仅返回当前日历时间(从1970-01-01 00:00:00 UTC到现在的秒数),不会尝试写入任何内存地址,这是完全符合C标准、安全可靠的用法。
  • 传入有效指针时,函数会把当前日历时间同时写入该指针指向的内存空间,同时返回相同的时间值。比如你如果初始化s = &seconds;,调用time(s)后,*s和函数返回值会是同一个值,相当于同时通过返回值和指针两种方式获取时间。

但你第二段代码里的s是未初始化的野指针,这时候调用time(s)属于未定义行为:

  • 函数会尝试把时间值写入s指向的随机内存地址,这种操作可能直接导致程序崩溃、破坏其他变量的数据,或者像你这次一样碰巧没出问题——这只是运气好,不代表代码合法。
  • 两次输出结果一致,是因为time()的返回值不受传入指针的影响:只要函数没崩溃,不管指针是否有效,都会返回正确的时间值。但写入野指针的操作本身是危险且不符合编码规范的。

总结:

  • time(NULL)是安全、标准的基础用法,仅通过返回值获取时间。
  • 传入有效指针是为了同时在指针指向的变量中存储时间值,属于合法的扩展用法。
  • 传入未初始化的指针(如你代码中的s)是严重错误,属于未定义行为,绝对不能这么写。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:48:24