关于mktime函数

wxhbqyh 2006-08-28 10:26:26
#include<time.h>
int main(void){

time_t t1;
time(&t1);
struct tm *p1;
p1=localtime(&t1);

sleep(1000);

time_t t2;
time(&t2);
struct tm *p2;
p2=localtime(&t2); /*取得当地时间*/
printf("%d,%d\n",mktime(p1),mktime(p2));
}

为什么输出的完全一样呢?应该是mktime(p2) = mktime(p1)+1才对啊
...全文
920 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
iunion 2006-08-29
  • 打赏
  • 举报
回复
int main(void){

time_t t1;
time_t t2;
struct tm *p1;
struct tm *p2;

time(&t1);
p1 = localtime(&t1);
t1 = mktime(p1);

sleep(1000);

time(&t2);
p2=localtime(&t2); /*取得当地时间*/
t2 = mktime(p2);
printf("%d,%d\n",t1 , t2);
printf("%d,%d\n",mktime(p1),mktime(p2));
return 0;
}
把2次輸出比較一下


另外:
int main(void){

time_t t1;
time_t t2;
struct tm *p1;
struct tm *p2;

time(&t1);
p1 = localtime(&t1);
t1 = mktime(p1);

time(&t2);
p2=localtime(&t2); /*取得当地时间*/
t2 = mktime(p2);

sleep(1000);

printf("%d,%d\n",t1 , t2);
printf("%d,%d\n",mktime(p1),mktime(p2));
return 0;
}
在執行看一下結果,可以分析出兩次localtime的返回值p1,p2是同一地址的
localtime是在對固定内存操作
晨星 2006-08-28
  • 打赏
  • 举报
回复
那样的话外界忘了free怎么办啊?
很少有库函数自己malloc了让人家调用者从外面free的,在信你想想看,有没有。
而在C++中使用时,说不定还被delete呢,更乱套了。
tailzhou 2006-08-28
  • 打赏
  • 举报
回复
localtime为什么不在函数内用malloc申请一块内存作为返回值呢?

晨星 2006-08-28
  • 打赏
  • 举报
回复
又上当了不是,难道你就一点也没怀疑过吗?为什么localtime函数返回的是一个指向结体的指针?而不是一个变量?
一般如果函数返回一个指向其内部变量指针,会有用吗,不危险吗?

显然localtime返回的要么是某个全局变量的地址,要么是个局部静态变量的地址,两次返回的都是同一地址。

实际上,每次调用localtime函数,此函数就会把新的结果写到那个变量中去,然后返回这个变量的地址,不信的话你可以使用
printf("%p, %p\n", p1, p2);
试试看。看看结果是不是一个地址。

所以,由于你没有及时将第一次的结果拷贝到独立的变量中,第二次的结果把第一次的给覆盖掉了,最后当你在prinf中调用mktime时,p1和p2完全是一个东西(地址都是一个,那还不是一个东西嘛),结果当然是一样的。

要看到差一秒的结果,应该至少把第一次的结果拷贝出来,比如这样:
#include <time.h>
#include <stdio.h>
int main(void){

time_t t1;
time(&t1);
struct tm p1; //这里使用结构体,而不是指针。

//拷贝第一次的结果,而不是仅仅保存那个内部传出来的地址。
memcpy(&p1, localtime(&t1), sizeof(struct tm));

sleep(1000);

time_t t2;
time(&t2);
struct tm *p2;
p2=localtime(&t2); /*取得当地时间*/

//注意前面改动后,这里p1要传地址。
printf("%d,%d\n",mktime(&p1),mktime(p2));
}
static __time64_t __cdecl _make__time64_t ( struct tm *tb, int ultflag ) { __time64_t tmptm1, tmptm2, tmptm3; struct tm tbtemp; long dstbias = 0; long timezone = 0; _VALIDATE_RETURN( ( tb != NULL ), EINVAL, ( ( __time64_t )( -1 ) ) ) /* * First, make sure tm_year is reasonably close to being in range. */ if ( ((tmptm1 = tb->tm_year) _MAX_YEAR64 + 1) ) goto err_mktime; /* * Adjust month value so it is in the range 0 - 11. This is because * we don't know how many days are in months 12, 13, 14, etc. */ if ( (tb->tm_mon tm_mon > 11) ) { tmptm1 += (tb->tm_mon / 12); if ( (tb->tm_mon %= 12) tm_mon += 12; tmptm1--; } /* * Make sure year count is still in range. */ if ( (tmptm1 _MAX_YEAR64 + 1) ) goto err_mktime; } /***** HERE: tmptm1 holds number of elapsed years *****/ /* * Calculate days elapsed minus one, in the given year, to the given * month. Check for leap year and adjust if necessary. */ tmptm2 = _days[tb->tm_mon]; if ( _IS_LEAP_YEAR(tmptm1) && (tb->tm_mon > 1) ) tmptm2++; /* * Calculate elapsed days since base date (midnight, 1/1/70, UTC) * * * 365 days for each elapsed year since 1970, plus one more day for * each elapsed leap year. no danger of overflow because of the range * check (above) on tmptm1. */ tmptm3 = (tmptm1 - _BASE_YEAR) * 365 + _ELAPSED_LEAP_YEARS(tmptm1); /* * elapsed days to current month (still no possible overflow) */ tmptm3 += tmptm2; /* * elapsed days to current date. */ tmptm1 = tmptm3 + (tmptm2 = (__time64_t)(tb->tm_mday)); /***** HERE: tmptm1 holds number of elapsed days *****/ /* * Calculate elapsed hours since base date */ tmptm2 = tmptm1 * 24; tmptm1 = tmptm2 + (tmptm3 = (__time64_t)tb->tm_hour); /***** HERE: tmptm1 holds number of elapsed hours *****/ /* * Calculate elapsed minutes since base date */ tmptm2 = tmptm1 * 60; tmptm1 = tmptm2 + (tmptm3 = (__time64_t)tb->tm_min); /***** HERE: tmptm1 holds number of elapsed minutes *****/ /* * Calculate elapsed seconds since base date */ tmptm2 = tmptm1 * 60; tmptm1 = tmptm2 + (tmptm3 = (__time64_t)tb->tm_sec); /***** HERE: tmptm1 holds number of elapsed seconds *****/ if ( ultflag ) { /* * Adjust for timezone. No need to check for overflow since * localtime() will check its arg value */ __tzset(); _ERRCHECK(_get_dstbias(&dstbias;)); _ERRCHECK(_get_timezone(&timezone;)); tmptm1 += timezone; /* * Convert this second count back into a time block structure. * If localtime returns NULL, return an error. */ if ( _localtime64_s(&tbtemp;, &tmptm1;) != 0 ) goto err_mktime; /* * Now must compensate for DST. The ANSI rules are to use the * passed-in tm_isdst flag if it is non-negative. Otherwise, * compute if DST applies. Recall that tbtemp has the time without * DST compensation, but has set tm_isdst correctly. */ if ( (tb->tm_isdst > 0) || ((tb->tm_isdst 0)) ) { tmptm1 += dstbias; if ( _localtime64_s(&tbtemp;, &tmptm1;) != 0 ) goto err_mktime; } } else { if ( _gmtime64_s(&tbtemp;, &tmptm1;) != 0) goto err_mktime; } /***** HERE: tmptm1 holds number of elapsed seconds, adjusted *****/ /***** for local time if requested *****/ *tb = tbtemp; return tmptm1; err_mktime: /* * All errors come to here */ errno = EINVAL; return (__time64_t)(-1); }

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧