void takeTime(struct tm * timeNow)
{
time_t timeInSec;
time(&timeInSec);
timeNow = localtime(&timeInSec);
return;
}
int main()
{
struct tm* timeNow;
takeTime(timeNow);
printf("%s\n", asctime(timeNow));
return 0;
}
Попытался выполнить код, но получил ошибку сегментации, может ли кто-нибудь объяснить, почему. я новичок в программировании!
В MSVC есть список различных функций управления временем
Функция localtime возвращает указатель на статически выделенную структуру.
Код в вопросе изменяет локальную копию указателя timeNow в takeTime, но значение не возвращается вызывающей стороне.
Если вы хотите передать указатель вызывающей стороне, вам нужно эмулировать ссылку, используя другой уровень косвенности, то есть указатель на указатель.
#include <stdio.h>
#include <time.h>
void takeTime(struct tm ** timeNow)
{
time_t timeInSec;
time(&timeInSec);
*timeNow = localtime(&timeInSec);
// This return at the end of a void function can be removed
// return;
}
int main(void)
{
struct tm* timeNow;
takeTime(&timeNow);
printf("%s\n", asctime(timeNow));
return 0;
}
Или вы можете захотеть получить копию этой структуры. Затем вам нужна структурная переменная в main и вы должны передать ее адрес.
#include <stdio.h>
#include <time.h>
void takeTime(struct tm * timeNow)
{
time_t timeInSec;
time(&timeInSec);
*timeNow = *localtime(&timeInSec);
// This return at the end of a void function can be removed
// return;
}
int main(void)
{
struct tm timeNow;
takeTime(&timeNow);
printf("%s\n", asctime(&timeNow));
return 0;
}
Или вы можете вернуть указатель
#include <stdio.h>
#include <time.h>
struct tm * takeTime(void)
{
time_t timeInSec;
time(&timeInSec);
return localtime(&timeInSec);
}
int main()
{
struct tm* timeNow;
timeNow = takeTime();
printf("%s\n", asctime(timeNow));
return 0;
}
Другой вариант возврата структуры и более подробное объяснение были показаны в ответе Фархода Нематова , который, к сожалению, был удален.
Вопросы, требующие помощи в отладке, как правило, должны предоставлять минимальный воспроизводимый пример проблемы, который включает все #include директивы. Это позволяет другим людям легко тестировать вашу программу, просто используя копирование и вставку.