使用C打印系统时出现意外输出

时间:2020-06-03 12:13:08

标签: c pointers time time.h

我一直在编写代码,该文件使用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(&currentTime);
    struct tm *myTime=localtime(&currentTime);
    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(&currentTime);
    struct tm *myTime=localtime(&currentTime);
    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-我知道这是一种精心设计的方法。但是正如我之前提到的,我正在更大的项目中使用它

1 个答案:

答案 0 :(得分:0)

您应该真正打开警告。

$ 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(&currentTime);
    struct tm *myTime=localtime(&currentTime);
    d.date=myTime->tm_mday;
    d.month=myTime->tm_mon+1;
    d.year=myTime->tm_year+1900;
    return d;
}

我实际上对您的代码没有崩溃感到有些惊讶。这是一种更可能的情况。