分段故障准时(0);

时间:2009-11-13 20:46:03

标签: c macos time segmentation-fault time-t

我正在重写一个旧程序来做一些新东西,突然我在下面的代码行中出现了分段错误错误:

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之间的比较有关。所以,我不认为segfault是由我对时间(0)的调用造成的..但我是仍然不确定究竟发生了什么。无论如何,问题解决了。谢谢你们。

6 个答案:

答案 0 :(得分:4)

也许你的堆栈框架中有一个荒谬的大对象溢出堆栈?有关如何发生的详细示例以及对情况的分析,请参阅this blog posttime(2)函数允许将NULL传递给它,并且time()实现的可能性很小。

答案 1 :(得分: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;
}

答案 2 :(得分:3)

通常您会发现分段错误将被捕获在错误的行上。它周围有什么线?是否有可能其中一个可能导致它?

  

标准库的时间函数以time_t *为参数,对吗?因此,它不是>令人惊讶的是你得到一个段错误:你正试图取消引用一个NULL指针!

time(0)或time(NULL)是使用时间函数访问当前时间的标准和可接受方式。

See reference.

答案 3 :(得分:1)

您的程序是否可能包含名为time的变量或本地函数,该函数与标准库的time函数发生冲突?

答案 4 :(得分:0)

正如亚当·罗森菲尔德所指出的那样,当程序在堆栈空间外时,程序可能会调用任何函数(而不仅仅是系统调用)。

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

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

ulimit -S unlimited

答案 5 :(得分:-1)

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

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

不是零?