Ошибка сегментации по времени (0); - PullRequest
4 голосов
/ 13 ноября 2009

Я переписываю старую программу, чтобы сделать что-то новое, и внезапно я получаю ошибку ошибки сегментации в следующей строке кода:

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");

Я по-прежнему получаю ошибку сегментации сразу после того, как напечатано "4", даже когда строка, где вызывается time (), закомментирована. «5» не выводится. Как это возможно?

Обновление 2:
Я перестроил свою функцию шаг за шагом, чтобы попытаться определить, где произошла ошибка в моем коде, и я думаю, что нашел проблему. Я не уверен, что было не так, но это было как-то связано со сравнением между целочисленным значением массива и 0. Итак, я не думаю, что ошибка произошла из-за моего вызова time (0) ... но до сих пор не уверен, что на самом деле произошло. В любом случае, проблема решена. Спасибо, ребята.

Ответы [ 6 ]

4 голосов
/ 14 ноября 2009

Если у вас есть #include <time.h>, компилятор знает, что ему нужно преобразовать это 0 в нулевой указатель. В противном случае он передает 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;
}
4 голосов
/ 13 ноября 2009

Возможно, у вас есть абсурдно большой объект в кадре стека, который переполняет стек? См. этот блог для подробного примера того, как это может произойти, и анализа ситуации. Функция time(2) позволяет передать ей NULL, и очень маловероятно, что ваша реализация time() содержит ошибку.

3 голосов
/ 13 ноября 2009

Часто вы обнаружите, что ошибка сегментации будет обнаружена в неправильной строке. Какие линии вокруг него? Возможно ли, что один из них может быть причиной этого?

Функция времени стандартной библиотеки принимает time_t * в качестве аргумента, верно? Следовательно, неудивительно, что вы получаете ошибку сегмента: вы пытаетесь разыменовать нулевой указатель!

время (0) или время (NULL) является стандартным и принятым способом доступа к текущему времени с использованием функции времени.

См. Ссылку.

1 голос
/ 14 ноября 2009

Возможно ли, что ваша программа содержит переменную или локальную функцию с именем time, которая сталкивается с функцией time стандартной библиотеки?

0 голосов
/ 20 апреля 2016

Как отметил Адам Розенфилд, программа может вызвать сбой в момент вызова любой функции (не только системных вызовов), когда в ней не хватает стека.

Теперь вашей программе может потребоваться для хранения огромных данных в стеке, а не в куче. В этом случае решением может быть изменение максимального стекового пространства для вашей конкретной среды.

В Linux его можно изменить с помощью ulimit , например,

ulimit -S unlimited
0 голосов
/ 13 ноября 2009

Прекрасно, но вы намеревались передать ему нулевой указатель как время (time_t * t)?

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

Не ноль?

...