什么是C中的时间(NULL)?

dmu*_*ubu 52 c time

我学习了一些基本的C函数,并time(NULL)在一些手册中遇到过.

这到底是什么意思?

jas*_*son 42

您可以传入指向将填充当前时间的time_t对象的指针time(并且返回值与您指向的值相同).如果你传入NULL,它只是忽略它,只返回一个time_t代表当前时间的新对象.


jon*_*sca 29

该调用time(NULL)返回当前日历时间(自1970年1月1日以来的秒数).请参阅此参考以获取详细信 通常,如果传入指向time_t 变量的指针,该指针变量将指向当前时间.

  • +1.对于`time_t`类型的变量`timer`,`time(&timer);`相当于`timer = time(NULL);` (10认同)

Ste*_*mit 13

[从一个重复的,现在删除的问题复制的答案.]

time()是一个非常非常古老的功能.它可以追溯到C语言甚至没有类型的那一天long.曾几何时,获得类似32位类型的唯一方法是使用两个ints 的数组- 那时ints是16位.

所以你打来电话

int now[2];
time(now);
Run Code Online (Sandbox Code Playgroud)

它将32位时间填入now[0]now[1],一次填充16位.(这解释了为什么其他与时间相关的函数,例如localtimectime,也倾向于通过指针接受他们的时间参数.)

后来,dmr完成long了对编译器的添加,所以你可以开始说了

long now;
time(&now);
Run Code Online (Sandbox Code Playgroud)

后来,有人意识到如果time()继续并返回值,它将是有用的,而不是仅通过指针填充它.但是 - 向后兼容性是一件很棒的事情 - 为了所有仍在进行的代码的好处time(&now),time()函数必须继续支持指针参数.这就是为什么 - 这就是为什么向后兼容性并不总是如此美妙 - 如果你使用返回值,你仍然必须传递NULL作为指针:

long now = time(NULL);
Run Code Online (Sandbox Code Playgroud)

(当然,后来我们开始使用time_t而不是简单long,所以,例如,它可以更改为64位类型,避免y2.038k问题.)

[PS我实际上并不确定改变int [2]long,并且添加返回值的更改发生在不同的时间; 他们可能同时发生了.但请注意,当时间表示为数组时,必须通过指针填充它,它不能作为值返回,因为当然C函数不能返回数组.

  • 2.4 Linux 内核有一个 64 位 `time_t` 的错误,如果你传入一个非 NULL 参数,它只会填充低 32 位,而高位保持不变。 (2认同)