我一直在编写一个代码,该代码使用time.h
头文件打印当前系统日期和时间,并得到意外的输出。注意:此摘录是较大系统的一部分。我已简化代码以指出错误部分。
#include<stdio.h>
#include<time.h>
typedef struct dater
{
int date;
int month;
int year;
}DATER;
typedef struct timer
{
int hour;
int min;
int sec;
}TIMER;
DATER * current_date()
{
DATER * d;
time_t currentTime;
time(¤tTime);
struct tm *myTime=localtime(¤tTime);
d->date=myTime->tm_mday;
d->month=myTime->tm_mon+1;
d->year=myTime->tm_year+1900;
return d;
}
TIMER * current_time()
{
TIMER * t;
time_t currentTime;
time(¤tTime);
struct tm *myTime=localtime(¤tTime);
t->hour=myTime->tm_hour;
t->min=myTime->tm_min;
t->sec=myTime->tm_sec;
return t;
}
int main()
{
DATER * d=current_date();
TIMER * t=current_time();
printf("Today's Date Is: %02d.%02d.%d\n",d->date,d->month,d->year);
printf("TIme Is: %02d:%02d:%02d",t->hour,t->min,t->sec);
return 1;
}
输出如下:
Today's Date Is: 17.39.17
Time Is: 39:17:17
如果我在printf("Today's Date Is: %02d.%02d.%d\n",d->date,d->month,d->year);
函数调用之前放置current_time()
语句,问题似乎会解决。
我不太了解为什么会这样,因为我将日期和时间存储在两个不同实例的两个不同结构中。
PS-我知道这是一种精心设计的方法。但是正如我之前提到的,我正在更大的项目中使用它
您应该真正打开警告。
$ gcc k.c -Wall -Wextra
k.c: In function ‘current_date’:
k.c:23:12: warning: ‘d’ is used uninitialized in this function [-Wuninitialized]
23 | d->date=myTime->tm_mday;
| ~~~~~~~^~~~~~~~~~~~~~~~
k.c: In function ‘current_time’:
k.c:35:12: warning: ‘t’ is used uninitialized in this function [-Wuninitialized]
35 | t->hour=myTime->tm_hour;
| ~~~~~~~^~~~~~~~~~~~~~~~
您尚未分配任何内存。 d
只是一个未初始化的指针。更改函数以返回结构或先分配内存。
DATER * current_date()
{
DATER *d = malloc(sizeof *d);
或
DATER current_date()
{
DATER d;
time_t currentTime;
time(¤tTime);
struct tm *myTime=localtime(¤tTime);
d.date=myTime->tm_mday;
d.month=myTime->tm_mon+1;
d.year=myTime->tm_year+1900;
return d;
}