12
#include <stdio.h>
#include <time.h>

int main()
{
     printf("Size of time_t is %lu bytes.\n", sizeof(time_t));
     time_t biggest = 0x7fffffffffffffff;   // line 1
     printf("time_t's wrap around will be a second after %s.\n", asctime(gmtime(&biggest)) );

     return 0;
}

在 time.h 中,这是 time_t 的定义吗?

typedef  __darwin_time_t   time_t

如何解释它?由于我没有任何想法,所以我使用 sizeof 函数找到了 time_t = 8 个字节。

为什么第 1 行给出错误呢?我收到此错误

Segmentation fault: 11
4

4 回答 4

7

您的呼叫gmtime()可能正在返回NULL(在我的 Mac OS X 系统上确实如此)。当您将此值传递给 时asctime(),您会得到一个异常(因为它需要一个非NULL指针)。

并非所有time_t值都可以在 a 中表示struct tm,这就是在这种情况下gmtime()返回的原因。NULL

于 2012-07-31T20:24:30.197 回答
6

尽管 time_t 的大小为 8,但在 64 位平台上,存在硬编码到运行时中的实现定义的限制,不能超过。当超出这些限制时,gmtime 将返回 NULL,并设置 errno 以指示错误的性质。您的代码无法检查 gmtime 返回的 NULL,因此 asctime 在尝试取消引用该空指针时失败。这是您在使用惯用 C 并且不检查可能失败的函数的返回值时所冒的危险。

Windows 10 上的 Microsoft C gmtime 在传递 32535291600 时返回 NULL,并将 errno 设置为 EINVAL。尽管有人可能认为理论上的最大限制应该是 LLONG_MAX。Microsoft 明确将限制设置为 _MAX__TIME64_T + _MAX_LOCAL_TIME。

来自 Microsoft Visual Studio 2010 CRT 源中的 ctime.h:

#define _MAX__TIME64_T 0x793406fffi64 /* number of seconds from 00:00:00, 01/01/1970 UTC to 23:59:59. 12/31/3000 UTC */ 

Apple 的 gmtime 函数在传递 67768036191676800 时返回 NULL 并且 errno 设置为 EOVERFLOW。Apple 实现在 asctime() 返回一年中超过 4 位的字符串的所有时间都表现出未定义的行为,因为 C 标准要求该函数不再返回超过 26 个字符。

于 2017-12-31T22:09:04.043 回答
5

我查看了 Linux 头文件,发现了以下内容:

/usr/include/time.h:
    typedef __time_t time_t;

/usr/include/bits/types.h:
    __STD_TYPE __TIME_T_TYPE __time_t

/usr/include/bits/typesizes.h
    #define __TIME_T_TYPE       __SLONGWORD_TYPE

/usr/include/bits/types.h:
    #define __SLONGWORD_TYPE    long int

所以 的大小time_tlong int。在 64 位机器上,您可能会得到 8 个字节。然后我发现在我的 32 位 FreeBSD 上,它看起来像这样:

/usr/include/machine/_types.h:
    typedef __int32_t   __time_t;   

所以大小是32位。

于 2013-10-22T08:51:13.120 回答
3

的基础类型time_t可以是任何东西。这在很大程度上取决于您的系统。请参考类似的问题:time_t 是什么原始数据类型?.

线程中有一个链接到sys/types.h的描述,其中声明

time_t 和clock_t 应为整数或实浮点类型。

一个好的答案的另一个链接:https ://stackoverflow.com/a/471287/276274

于 2012-07-31T20:22:46.393 回答