在编写C
语言的应
用程序时
,为了获
取或者打
印一些跟
时间有关
的信息,
我们经常
会使用到
C语言自
带的一些
时间函数
,诸如:
time
、loc
alti
me、c
time
、mkt
ime和
asct
ime等
。但你可
能没有注
意到这里
面含有一
些有趣的
现象,先
来看一个
例子:
1 #include < stdio.h>
2 #include < time.h>
3
4 int main ()
5 {
6
7 time_t time_1, time_2;
8 struct tm *tm_1, *tm_2, *tm_3;
9 struct tm tm_4, tm_5;
10
11 printf(" ---- ---- ---- ---- ---- PART I ---- ---- ---- ---- ---\ n" );
12
13 time_1 = time(NULL);
14 sleep(3);
15 time_2 = time(NULL);
16 printf(" time1:%d time2:%d\n" ,time_1,time_2);
17
18 tm_1 = (struct tm*)localtime(& time_1);
19 tm_2 = (struct tm*)localtime(& time_2);
20 tm_3 = (struct tm*)localtime(& time_1);
21
22 printf(" tm_1 ptr:%p tm_2 ptr:%p tm_3 ptr:%p\n" ,tm_1,tm_2,tm_3);
23 printf(" asctime(tm_1):%s" ,asctime(tm_1));
24 printf(" asctime(tm_2):%s" ,asctime(tm_2));
25 printf(" asctime(tm_3):%s" ,asctime(tm_3));
26 }
---- ---- ---- ---- ---- PART I -------------------
time1:1340256774 time2:1340256777
tm_1 ptr:0xfec6f48 tm_2 ptr:0xfec6f48 tm_3 ptr:0xfec6f48
asctime(tm_1):Thu Jun 21 01:32:54 2012
asctime(tm_2):Thu Jun 21 01:32:54 2012
asctime(tm_3):Thu Jun 21 01:32:54 2012
1 #include < stdio.h>
2 #include < time.h>
3
4 int main ()
5 {
6
7 time_t time_1, time_2;
8 struct tm *tm_1, *tm_2, *tm_3;
9 struct tm tm_4, tm_5;
10
11 printf(" ---- ---- ---- ---- ---- PART I ---- ---- ---- ---- ---\ n" );
12
13 time_1 = time(NULL);
14 sleep(3);
15 time_2 = time(NULL);
16 printf(" time1:%d time2:%d\n" ,time_1,time_2);
17
18 tm_1 = (struct tm*)localtime(& time_1);
19 tm_2 = (struct tm*)localtime(& time_2);
20 tm_3 = (struct tm*)localtime(& time_1);
21
22 printf(" tm_1 ptr:%p tm_2 ptr:%p tm_3 ptr:%p\n" ,tm_1,tm_2,tm_3);
23 printf(" asctime(tm_1):%s" ,asctime(tm_1));
24 printf(" asctime(tm_2):%s" ,asctime(tm_2));
25 printf(" asctime(tm_3):%s" ,asctime(tm_3));
26
27
28 printf(" ---- ---- ---- ---- ---- PART II ---- ---- ---- ---- ---\ n" );
29
30 time_1 = time(NULL);
31 sleep(3);
32 time_2 = time(NULL);
33 printf(" time1:%d time2:%d\n" ,time_1,time_2);
34
35 tm_4 = *((struct tm*)localtime(& time_1));
36 tm_5 = *((struct tm*)localtime(& time_2));
37
38 printf(" tm_4 ptr:%p tm_5 ptr:%p\n" ,& tm_4,& tm_5);
39 printf(" tm_4 sec:%d tm_5 sec:%d\n" ,tm_ 4.tm _sec ,tm_ 5.tm _sec );
40
41 printf(" asctime(& tm_4):%sasctime(& tm_5):%s" ,asctime(& tm_4),asctime(& tm_5));
42 printf(" asctime(& tm_4) ptr:%p asctime(& tm_5) ptr:%p\n" ,asctime(& tm_4),asctime(& tm_5));
43
44 printf(" asctime(& tm_4):%s" ,asctime(& tm_4));
45 printf(" asctime(& tm_5):%s" ,asctime(& tm_5));
---- ---- ---- ---- ---- PART II -------------------
time1:1340256777 time2:1340256780
tm_4 ptr:0xffe82dd8 tm_5 ptr:0xffe82e08
tm_4 sec:57 tm_5 sec:0
asctime(& tm_4):Thu Jun 21 01:33:00 2012
asctime(& tm_5):Thu Jun 21 01:33:00 2012
asctime(& tm_4) ptr:0xfec59dc asctime(& tm_5) ptr:0xfec59dc
asctime(& tm_4):Thu Jun 21 01:32:57 2012
asctime(& tm_5):Thu Jun 21 01:33:00 2012
1) 调用asctime(& tm_4 ),按照 tm_4 的信息更 新内部静 态字符数 组,返回 字符数组 的地址;
2) 调用asctime(& tm_5 ),按照 tm_5 的信息更 新内部静 态字符数 组,返回 字符数组 的地址。 在这一步 中,新的 tm_5 的信息将 会覆盖掉 原来tm _4的那 些信息。
3) 打印第一 个参数指 向地址的 字符串, 即该内部 静态字符 数组。此 时这个字 符串已经 被更新为 tm_5 的信息了 ,因此, 将打印t m_5对 应的时间 信息。
4) 打印第二 个参数指 向地址的 字符串, 即tm_ 5对应的 时间信息 。