一个linux c的问题,大家请帮忙。

C、C++和Java语言
回复
ll_211314
帖子: 16
注册时间: 2010-01-21 21:18
送出感谢: 0
接收感谢: 0

一个linux c的问题,大家请帮忙。

#1

帖子 ll_211314 » 2010-03-03 13:23

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
struct tm *tm_ptr, timestruct;
time_t the_time;
char buf[256];
char *result;

(void) time(&the_time);
tm_ptr = localtime(&the_time);
strftime(buf, 256, “%A %d %B, %I:%S %p”, tm_ptr);

printf(“strftime gives: %s\n”, buf);

strcpy(buf,”Thu 26 July 2007, 17:53 will do fine”);

printf(“calling strptime with: %s\n”, buf);
tm_ptr = &timestruct;

result = strptime(buf,”%a %d %b %Y, %R”, tm_ptr);
printf(“strptime consumed up to: %s\n”, result);

printf(“strptime gives:\n”);
printf(“date: %02d/%02d/%02d\n”,
tm_ptr->tm_year % 100, tm_ptr->tm_mon+1, tm_ptr->tm_mday);
printf(“time: %02d:%02d\n”,
tm_ptr->tm_hour, tm_ptr->tm_min);
exit(0);
}


下面是运行结果
strftime gives: Saturday 09 June, 08:16 AM
calling strptime with: Thu 26 July 2007, 17:53 will do fine
strptime consumed up to: will do fine
strptime gives:
date: 07/07/26
time: 17:53

下面是我不明白的地方
tm_ptr = &timestruct;不明白干什么用的,把这个语句去掉了运行结果也是一样,感觉timestruct就没什么用,哪个兄弟明白帮解答一下。
ll_211314
帖子: 16
注册时间: 2010-01-21 21:18
送出感谢: 0
接收感谢: 0

Re: 一个linux c的问题,大家请帮忙。

#2

帖子 ll_211314 » 2010-03-04 10:26

看来这个帖子没办法结贴了。
yongsunshine
帖子: 4
注册时间: 2009-10-30 11:25
送出感谢: 0
接收感谢: 0

Re: 一个linux c的问题,大家请帮忙。

#3

帖子 yongsunshine » 2010-03-04 10:36

tm_ptr = &timestruct;
作用是把指针指向timestruct。因为tm_ptr这个指针在定义完并未初始化,即野指针,如果指针指向非法区域,会造成系统崩溃。这个步骤作用就是把指针指向已分配的一个区域。运行结果一样并不代表这样写没有隐患。 :em01
ll_211314
帖子: 16
注册时间: 2010-01-21 21:18
送出感谢: 0
接收感谢: 0

Re: 一个linux c的问题,大家请帮忙。

#4

帖子 ll_211314 » 2010-03-04 14:15

yongsunshine 写了:tm_ptr = &timestruct;
作用是把指针指向timestruct。因为tm_ptr这个指针在定义完并未初始化,即野指针,如果指针指向非法区域,会造成系统崩溃。这个步骤作用就是把指针指向已分配的一个区域。运行结果一样并不代表这样写没有隐患。 :em01

前面有这句话tm_ptr = localtime(&the_time);不是把指针指向一个分配的区域吗。
t3swing
帖子: 1028
注册时间: 2008-11-01 21:42
来自: 树下板凳
送出感谢: 0
接收感谢: 1 次

Re: 一个linux c的问题,大家请帮忙。

#5

帖子 t3swing » 2010-03-04 15:01

localtime的实现有点特殊 ,用了static 变量,所以不存在野指针问题,没用到malloc或者new,也不需要释放.tm_ptr开始时指向localtime(&the_time)返回的静态内存,tm_ptr = &timestruct;后tm_ptr指向timestruct ,注意这两个函数的不同!strptime 和strftime
strftime把tm_ptr(指向localtime(&the_time)) 格式化后写入buf
strftime把buf格式化后重新写入到tm_ptr
所以没有tm_ptr = &timestruct;这句话 打印出来的事之前静态内存中的值
有这句话是把用buf格式化的timestruct打印出来,估计是lz没有看清这两个函数的区别

//大概是这样实现的
struct tm *localtime( const time_t *time )
{
static struct tm _tm;
...
return &_tm;
}
民族的脊梁,是踏实做事的人,非只知道骂街的泼妇。
回复

回到 “C/C++/Java”