首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ctime返回null

ctime返回null
EN

Stack Overflow用户
提问于 2011-05-18 01:54:19
回答 3查看 2.5K关注 0票数 1

如果用户类型time_t被定义为__darwin_time_t,而它本身在MacOS X中被定义为long,那么为什么下面的代码输出8 Time is (null)呢?也许这是愚蠢的事情,但我真的不能理解它。

代码语言:javascript
复制
#include <stdio.h>
#include <time.h>

int main(void)
{
    time_t time = 0x7FFFFFFFFFFFFFFF;

    printf("%lu\n"
           "Time is %s\n", sizeof(time_t), ctime(&time));

    return 0;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-18 02:06:16

时间0x7FFFFFFFFFFFFFFFFFFFFFFF似乎是在公元292,471,210,647年左右,这无疑会导致ctime超过C99保证的26个字符,因此它返回NULL而不是溢出其缓冲区。一般来说,尽量避免任何发生在莫洛克人与埃洛伊人开战之后的日期。

票数 9
EN

Stack Overflow用户

发布于 2012-02-27 13:05:59

在阅读"Expert C Programming“一书时,我在Lion 10.7.3中遇到了同样的问题--使用t=0xf0c00000000000时,ctime(&t)返回Wed Mar 1 21:07:12 214739252,而使用t=0xf0d00000000000, ctime(&t)时,返回null指针(0x0)。所以它看起来不像是t的回绕,而是ctime(&t)内部的一些测试,如果t太大,它会返回空指针。

票数 2
EN

Stack Overflow用户

发布于 2014-12-03 23:10:55

我们从glibc's implementation上读到:

我们限制可以打印的年份的大小。如果使用%d格式说明符,则1900的加法会使数字溢出,并打印负值。对于某些架构,理论上我们可以使用%ld或更大的整数格式,但这意味着输出需要更多空间。如果“asctime_r”接口被合理地定义并传递缓冲区大小,这将不是问题。

运行下面的程序,找到您机器上的确切限制。

代码语言:javascript
复制
#include <limits.h>
#include <stdio.h>
#include <time.h>

/**
 * Find the largest time_t for which ctime returns a non-NULL value
 * using a bsearch between 0 and LONG_MAX.
 **/
static time_t ctime_max() {
    time_t start = 0, end = LONG_MAX, mid;
    while (start < end) {
        mid = start + (end - start) / 2;
        if (ctime(&mid)) {
            /* this mid is ctime-able; try higher */
            start = mid + 1;
        } else {
            /* this mid is not ctime-able; try lower */
            end = mid;
        }
    }
    /* mid is now the lowest number that's too high; subtract one */
    return mid - 1;
}

int main() {
    time_t t = ctime_max();
    printf("%s", ctime(&t));
    return 0;
}

对我来说,这就是Tue Dec 31 23:59:59 2147483647,它恰好是今年溢出四个有符号字节之前的第二个字节。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6035000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档