time_t的大小及其最大值

时间:2012-07-31 20:14:06

标签: c

#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 个答案:

答案 0 :(得分:8)

您对gmtime()的呼叫可能正在返回NULL(它在我的Mac OS X系统上)。将此值传递给asctime()时,会出现异常(因为它需要非NULL指针)。

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

答案 1 :(得分:3)

我查看了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_t的大小为long int。在64位机器上,您可能获得8个字节。 然后我发现在我的FreeBSD上,它是32位,它看起来像这样:

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

所以大小是32位。

答案 2 :(得分:2)

time_t的基础类型可以是任何东西。这很大程度上取决于您的系统。请参阅类似的问题:What primitive data type is time_t?

线程中有一条链接指向sys/types.h的描述

  

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

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

答案 3 :(得分:2)

虽然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:

<Window x:Class="GoatJira.View.About"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:GoatJira.View"
    xmlns:viewmodel="clr-namespace:GoatJira.ViewModel"
    mc:Ignorable="d"
    Title="{Binding Path=AboutTitle}" Height="322.613" Width="573.608" ResizeMode="NoResize" ShowInTaskbar="False" WindowStartupLocation="CenterScreen" Initialized="Window_Initialized"
    DataContext="{Binding Source={StaticResource ResourceKey=AboutData}}"
    >

<Window.Resources>
    <ResourceDictionary>
        <viewmodel:AboutViewModel x:Key="AboutData"/>
    </ResourceDictionary>
</Window.Resources>
…

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