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

