ctime返回null

时间:2011-05-17 17:54:19

标签: c macos time x86-64 ctime

如果用户类型time_t定义为__darwin_time_t,其本身在MacOS X中定义为long,为什么以下代码会输出8 Time is (null)?也许这是愚蠢的事,但我无法理解它。

#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;
}

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

在完成“专家C编程”一书时,我在Lion 10.7.3中遇到了同样的问题 - t=0xf0c00000000000ctime(&t)收益Wed Mar 1 21:07:12 214739252和{{1返回空指针(0x0)。 所以它似乎不是t的回绕,但是t=0xf0d00000000000, ctime(&t)内的一些测试如果t太大则返回空指针。

答案 2 :(得分:1)

glibc's implementation我们读到:

  

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

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

#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恰好是一年之前的第二个溢出四个有符号字节。