我正在重写一个旧程序来做一些新东西,突然我在下面的代码行中出现了分段错误错误:
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)的调用造成的..但我是仍然不确定究竟发生了什么。无论如何,问题解决了。谢谢你们。
答案 0 :(得分:4)
也许你的堆栈框架中有一个荒谬的大对象溢出堆栈?有关如何发生的详细示例以及对情况的分析,请参阅this blog post。 time(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)是使用时间函数访问当前时间的标准和可接受方式。
答案 3 :(得分:1)
您的程序是否可能包含名为time
的变量或本地函数,该函数与标准库的time
函数发生冲突?
答案 4 :(得分:0)
正如亚当·罗森菲尔德所指出的那样,当程序在堆栈空间外时,程序可能会调用任何函数(而不仅仅是系统调用)。
现在,您的程序实际上可能需要将大量数据存储在堆栈而不是堆中。在这种情况下,解决方案可能是更改特定环境的最大堆栈空间。
在Linux上,可以使用ulimit进行更改,例如
ulimit -S unlimited
答案 5 :(得分:-1)
很可爱,但你是否打算将它作为时间(time_t * t)传递给空指针?
time(NULL);
time(((void*)0));
不是零?