#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
答案 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个字符。