C中的时间(NULL)是啥?
Posted
技术标签:
【中文标题】C中的时间(NULL)是啥?【英文标题】:What is time(NULL) in C?C中的时间(NULL)是什么? 【发布时间】:2011-11-24 21:39:40 【问题描述】:我学习了一些基本的C函数,并在一些手册中遇到了time(NULL)
。
这到底是什么意思?
【问题讨论】:
【参考方案1】:对time(NULL)
的调用返回当前日历时间(自 1970 年 1 月 1 日以来的秒数)。有关详细信息,请参阅this reference。通常,如果您传入一个指向time_t
variable 的指针,该指针变量将指向当前时间。
【讨论】:
+1。同样对于time_t
类型的变量timer
,time(&timer);
等价于timer = time(NULL);
【参考方案2】:
您可以传入一个指向time_t
对象的指针,time
将用当前时间填充该对象(返回值与您指向的相同)。如果你传入NULL
,它只是忽略它,只返回一个新的time_t
对象,表示当前时间。
【讨论】:
【参考方案3】:time
函数返回当前时间(作为 time_t
值),以秒为单位(在 Unix 系统上,自 UTC 时间 1970 年 1 月 1 日午夜开始),它接受一个参数,time_t
指针其中存储时间。将NULL
作为参数传递会导致time
将时间作为正常返回值返回,但不会将其存储在其他任何地方。
【讨论】:
【参考方案4】:您必须参考documentation for ctime。 time
是一个函数,它接受一个time_t *
类型的参数(指向time_t
对象的指针)并为其分配当前时间。除了传递这个指针,你也可以传递NULL
,然后使用返回的time_t值来代替。
【讨论】:
这里所指的ctime
是C++头<ctime>
,与C头<time.h>
类似。 (问题是关于 C,而不是 C++。)还有一个名为 ctime
的函数。【参考方案5】:
Time
:它返回自 1970 年 1 月 1 日以来经过的时间(以秒为单位)
【讨论】:
【参考方案6】:您可以传入指向time_t
对象的指针,该对象的时间将被当前时间填满(返回值与您指向的相同)。如果你传入NULL
,它就会忽略它,只返回一个新的time_t
对象,它代表当前时间。
Nb:time(&timer);
等价于timer = time(NULL);
【讨论】:
【参考方案7】:int main (void)
//print time in seconds from 1 Jan 1970 using c
float n = time(NULL);
printf("%.2f\n" , n);
这会打印 1481986944.00(此时)。
【讨论】:
这个答案是错误的,因为time
返回time_t
,存储到float
时会丢失精度。【参考方案8】:
[从duplicate, now-deleted question复制的答案。]
time()
是一个非常非常古老的函数。它可以追溯到 C 语言甚至没有类型 long
的那一天。曾几何时,获得类似 32 位类型的唯一方法是使用包含两个 int
s 的数组——那时 int
s 是 16 位。
所以你打电话
int now[2];
time(now);
它将 32 位时间填充到 now[0]
和 now[1]
,一次 16 位。 (这解释了为什么其他与时间相关的函数,例如 localtime
和 ctime
,也倾向于通过指针接受它们的时间参数。)
后来,dmr 完成了将long
添加到编译器,所以你可以开始说
long now;
time(&now);
后来,有人意识到如果 time()
继续返回值而不是仅仅通过指针填充它会很有用。但是——向后兼容是一件很棒的事情——为了所有仍在执行time(&now)
的代码,time()
函数必须继续支持指针参数。这就是为什么——这就是为什么向后兼容并不总是那么美好的事情,毕竟——如果你使用返回值,你仍然必须将 NULL 作为指针传递:
long now = time(NULL);
(当然,后来我们开始多次使用time_t
而不是普通的long
,例如,可以将其更改为64位类型,避开y2.038k problem。)
[附注我实际上不确定从int [2]
到long
的更改以及添加返回值的更改发生在不同的时间;它们可能同时发生。但请注意,当时间表示为数组时,它必须通过指针填充,它不能作为值返回,因为当然 C 函数不能返回数组。 ]
【讨论】:
2.4 Linux 内核有一个 64 位time_t
的错误,如果你传入一个非 NULL 参数,它只会填充低 32 位而高位不变。以上是关于C中的时间(NULL)是啥?的主要内容,如果未能解决你的问题,请参考以下文章
C语言 字符串处理函数strtok第二次及以后的调用中第一个参数要用NULL的原因是啥? 能不能解释下原理?
选择 null:D3 中 selectAll(null) 背后的原因是啥?