4

我正在重写一个旧程序来做一些新的事情,突然我在下面的代码行中得到一个分段错误错误:

time_t seconds_since_time_begun = time(0);

为什么,哦,为什么?

更新:
我在我的代码中包含了 time.h 头文件,当我尝试下面的 pmg 建议时,两个变量的大小都是 4。

当我尝试以下操作时:

printf("4\n");
// time_t seconds_since_time_begun = time(0);
printf("5\n");

即使在调用 time() 的行被注释掉后,我仍然会在打印“4”后立即出现分段错误。不输出“5”。这怎么可能?

更新2:
我一步一步地重建了我的函数,试图找出我的代码中发生错误的地方,我想我找到了问题所在。我不确定出了什么问题,但它与整数数组值和 0 之间的比较有关。所以,我认为段错误不是由我对 time(0) 的调用引起的……但我是仍然不确定实际发生了什么。总之,问题解决了。多谢你们。

4

6 回答 6

4

也许您的堆栈框架中有一个大得离谱的对象溢出堆栈?请参阅此博客文章以获取有关如何发生这种情况以及对情况进行分析的详细示例。该time(2)函数允许NULL传递给它,并且您的time()实现极不可能有错误。

于 2009-11-13T20:50:48.530 回答
4

如果您有#include <time.h>编译器知道它需要将其转换0为 NULL 指针。否则,它将一个传递int给函数。

我认为您的实施(int)0方式与(time_t*)0.

所以...添加

#include <time.h>

到你的代码

编辑

试试这个

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

int main(void) {
    printf("size of (int): %d\n", (int)sizeof (int));
    printf("size of (time_t*): %d\n", (int)sizeof (time_t*));
    return 0;
}
于 2009-11-13T21:25:37.727 回答
3

通常你会发现在不正确的行上会发现一个分段错误。它周围的线条是什么?是否有可能其中之一可能导致它?

标准库的 time 函数以 time_t * 作为参数,对吧?因此,遇到段错误也就不足为奇了:您正试图取消引用 NULL 指针!

time(0) 或 time(NULL) 是使用 time 函数访问当前时间的标准和公认方法。

见参考。

于 2009-11-13T20:51:46.583 回答
1

您的程序是否可能包含一个名为time与标准库函数冲突的变量或局部time函数?

于 2009-11-13T21:27:09.973 回答
0

正如 Adam Rosenfield 所指出的,当堆栈空间不足时,程序可能会在调用任何函数(不仅仅是系统调用)时出现段错误。

现在,您的程序实际上可能确实需要在堆栈而不是堆上存储大量数据。在这种情况下,解决方案可能是更改特定环境的最大堆栈空间。

在 Linux 上,可以使用ulimit更改它,例如

ulimit -S unlimited
于 2016-04-20T08:04:51.623 回答
-1

可爱,但是您是否打算将空指针作为 time(time_t *t) 传递给它?

time(NULL);
time(((void*)0));

不是零?

于 2009-11-13T20:48:23.883 回答