OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5846|回复: 16

关于sprintf()函数使用后指针内容变了

[复制链接]

94

主题

260

帖子

0

精华

高级会员

Rank: 4

积分
650
金钱
650
注册时间
2013-10-23
在线时间
48 小时
发表于 2015-6-25 21:00:47 | 显示全部楼层 |阅读模式
5金钱
typedef struct
{
u16 year;
u8 mon;
u8 day;
u8 hour;
u8 min;
u8 sec;
u8 week;
}RTC_Struct;


RTC_Struct *DateTime;

char Date_Str[11];
char Time_Str[9];


DateTime=RTC_GetTime();
printf("%d %d %d %d %d %d",DateTime->year,DateTime->mon,DateTime->day,DateTime->hour,DateTime->min,DateTime->sec);
//snprintf(Time_Str,9,"%d:%d:%d",DateTime->hour,DateTime->min,DateTime->sec);
sprintf(Time_Str,"%d:%d:%d",DateTime->hour,DateTime->min,DateTime->sec);
sprintf(Date_Str,"%d-%d-%d",DateTime->year,DateTime->mon,DateTime->day);
//snprintf(Date_Str,11,"%d-%d-%d",DateTime->year,DateTime->mon,DateTime->day);
printf("%d %d %d %d %d %d",DateTime->year,DateTime->mon,DateTime->day,DateTime->hour,DateTime->min,DateTime->sec);
res=f_open (&fil,"0:?±?°????I.xls",FA_WRITE|FA_READ|FA_OPEN_ALWAYS);

最佳答案

查看完整内容[请看2#楼]

回复【13楼】正点原子: --------------------------------- 我知道了,我的RTC_Get()返回后结构体变量被释放,指针变成了野指针,还是C语言不扎实啊,快睡着了想起来了,明天试试
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

94

主题

260

帖子

0

精华

高级会员

Rank: 4

积分
650
金钱
650
注册时间
2013-10-23
在线时间
48 小时
 楼主| 发表于 2015-6-25 21:00:48 | 显示全部楼层
回复【13楼】正点原子:
---------------------------------
我知道了,我的RTC_Get()返回后结构体变量被释放,指针变成了野指针,还是C语言不扎实啊,快睡着了想起来了,明天试试
回复

使用道具 举报

94

主题

260

帖子

0

精华

高级会员

Rank: 4

积分
650
金钱
650
注册时间
2013-10-23
在线时间
48 小时
 楼主| 发表于 2015-6-25 21:03:28 | 显示全部楼层
第一个printf()输出的DateTime还是对的,调用两次sprintf()之后再printf()出来的DateTime就不对了,程序移植了UCOS,函数都是可重入的
回复

使用道具 举报

94

主题

260

帖子

0

精华

高级会员

Rank: 4

积分
650
金钱
650
注册时间
2013-10-23
在线时间
48 小时
 楼主| 发表于 2015-6-25 21:05:48 | 显示全部楼层
用snprintf()也一样出错
回复

使用道具 举报

94

主题

260

帖子

0

精华

高级会员

Rank: 4

积分
650
金钱
650
注册时间
2013-10-23
在线时间
48 小时
 楼主| 发表于 2015-6-25 21:11:49 | 显示全部楼层
求大神。。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-25 22:31:38 | 显示全部楼层
RTC_GetTime,返回值是什么类型?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

94

主题

260

帖子

0

精华

高级会员

Rank: 4

积分
650
金钱
650
注册时间
2013-10-23
在线时间
48 小时
 楼主| 发表于 2015-6-25 22:34:53 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
RTC_Struct* RTC_GetTime(void),RTC_Struct类型的指针
回复

使用道具 举报

94

主题

260

帖子

0

精华

高级会员

Rank: 4

积分
650
金钱
650
注册时间
2013-10-23
在线时间
48 小时
 楼主| 发表于 2015-6-25 22:46:44 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
调用sprintf()函数之后直接把DateTime指针指向的结构体的值给改变了,怎么会出现这样的情况
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-6-25 22:48:06 | 显示全部楼层
使用printf、sprintf之类的函数,在ucos下前后加上临界代码
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

94

主题

260

帖子

0

精华

高级会员

Rank: 4

积分
650
金钱
650
注册时间
2013-10-23
在线时间
48 小时
 楼主| 发表于 2015-6-25 22:49:00 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
之前用时间结构体用的全局变量到是没有问题,但是使用全局变量的函数不可重入,不太好,换成指针就出问题了
回复

使用道具 举报

94

主题

260

帖子

0

精华

高级会员

Rank: 4

积分
650
金钱
650
注册时间
2013-10-23
在线时间
48 小时
 楼主| 发表于 2015-6-25 22:50:09 | 显示全部楼层
回复【9楼】骑着蜗牛追梦想:
---------------------------------
不对,之前也出问题的,说错了
回复

使用道具 举报

94

主题

260

帖子

0

精华

高级会员

Rank: 4

积分
650
金钱
650
注册时间
2013-10-23
在线时间
48 小时
 楼主| 发表于 2015-6-25 22:59:46 | 显示全部楼层
回复【8楼】八度空间:
---------------------------------
你好,我只有这一个任务使用了RTC_GetTime()函数以及RTC_Struct结构体,其他任务或中断都不会修改RTC_Struct结构体,不知道时间结构体的值怎么会被改变的
回复

使用道具 举报

94

主题

260

帖子

0

精华

高级会员

Rank: 4

积分
650
金钱
650
注册时间
2013-10-23
在线时间
48 小时
 楼主| 发表于 2015-6-25 23:00:52 | 显示全部楼层
回复【11楼】骑着蜗牛追梦想:
---------------------------------
回复【8楼】八度空间:
---------------------------------
而且是被改成一堆很大的数字
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-25 23:44:54 | 显示全部楼层
回复【6楼】骑着蜗牛追梦想:
---------------------------------
那你这些数据,存储在哪个位置?
返回都是指针类型的。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

94

主题

260

帖子

0

精华

高级会员

Rank: 4

积分
650
金钱
650
注册时间
2013-10-23
在线时间
48 小时
 楼主| 发表于 2015-6-26 00:25:58 | 显示全部楼层
回复【13楼】正点原子:
---------------------------------
RTC_GetTime()函数里面定义了RTC_Struct类型的结构体和RTC_Struct类型的指针,指针指向结构体,返回指针

RTC_Struct RTC_Structure;
RTC_Struct *DateTime=&RTC_Structure;
        .....
        return DateTime;
这是RTC_GetTime()函数里面的
回复

使用道具 举报

2

主题

239

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2015-6-5
在线时间
110 小时
发表于 2015-6-26 16:35:19 | 显示全部楼层
void RTC_GetTime(RTC_Struct* DATETime)

改成這種方式吧
回复

使用道具 举报

94

主题

260

帖子

0

精华

高级会员

Rank: 4

积分
650
金钱
650
注册时间
2013-10-23
在线时间
48 小时
 楼主| 发表于 2015-6-26 18:29:46 | 显示全部楼层
回复【16楼】Rocks:
---------------------------------
还好了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 22:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表