5345|6

90

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

keil C51 函数中 字符串指针 [复制链接]

以前一直都是做MIPS的,现在改行做51,感觉比较痛苦。很多东西都和以前不一样的,限制的东西蛮多的。MIPS C语言和标准C基本是没有差别的,可以C51就不一样啦~~~,今日遇到一个问题,请各位大侠帮忙解答一下,这个function是我自己写的,后来感觉不正常,怎么可以将函数中的声明的字符串指针返回呢,在标准C中是绝对不错误的,函数中的所有的声明的变量都是在堆栈中,函数执行完以后会被清除,使用堆栈中的指针,得到的东西是不确定。可是下面函数在C51中却是正确的,这是怎么回事?难道C51中函数声明的数组不是在堆栈中分配的嘛?
/**************************************************************************
*  Function Name: RtcClockText                                           *
*  Purposes:      Clock2Text                                             *
*  Descriptions:                                                         *
*  Arguments:                                                            *
*  Returns:                                                              *
*  See also:                                                             *
**************************************************************************/
U8* RtcClockDispText(void)
{
    #define A_HOUR_TOL   ((U32)60 * 60 * 10)
    #define A_MINUTE     ((U32)60 * 10)  
    #define A_SECOND_TOL ((U32)10)   
   
    U8 u8StringBuffer[9];
    //printf("---> %ld")
    U32 RTCtime = MDrv_GetRtcClock();
//    printf("---> RTCtime %ld \r\n",RTCtime);
   
    MApp_UlongToString(RTCtime / A_HOUR_TOL, &u8StringBuffer[0], 2 );
    u8StringBuffer[2]        = CHAR_COLON;
    MApp_UlongToString((RTCtime % A_HOUR_TOL) / (A_MINUTE),   &u8StringBuffer[3], 2 );
    u8StringBuffer[5]        = CHAR_COLON;
    MApp_UlongToString((RTCtime % A_MINUTE) / A_SECOND_TOL,   &u8StringBuffer[6], 2 );
    u8StringBuffer[8]   = 0;
   
    return u8StringBuffer;   
}

最新回复

C51的局部变量一般都是预先分配的,跟静态变量差不多.如果你想它在栈上分配的话,可以在函数前添加reentrant,声明为可重入的函数  详情 回复 发表于 2007-5-26 19:18
点赞 关注

回复
举报

73

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
如下改动:
/**************************************************************************
*  Function Name: RtcClockText                                           *
*  Purposes:      Clock2Text                                             *
*  Descriptions:                                                         *
*  Arguments:                                                            *
*  Returns:                                                              *
*  See also:                                                             *
**************************************************************************/
void RtcClockDispText(U8 *StrBuf)
{
    #define A_HOUR_TOL   ((U32)60 * 60 * 10)
    #define A_MINUTE     ((U32)60 * 10)  
    #define A_SECOND_TOL ((U32)10)   
   
//    U8 u8StringBuffer[9];
    //printf("---> %ld")
    U32 RTCtime = MDrv_GetRtcClock();
//    printf("---> RTCtime %ld \r\n",RTCtime);
   
    MApp_UlongToString(RTCtime / A_HOUR_TOL, &StrBuf[0], 2 );
    StrBuf[2]        = CHAR_COLON;
    MApp_UlongToString((RTCtime % A_HOUR_TOL) / (A_MINUTE),   &StrBuf[3], 2 );
    StrBuf[5]        = CHAR_COLON;
    MApp_UlongToString((RTCtime % A_MINUTE) / A_SECOND_TOL,   &StrBuf[6], 2 );
    StrBuf[8]   = 0;
   
//    return u8StringBuffer;   
}
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
呵呵,谢谢~~~.我也知道是这样改啊,我不是问如何用指针修改值。 今天下午研究了一下,发现函数中的数组不是在堆栈中去分配的,而且是一直存在的的,除非在整个函数中对它做改变,感觉不是很爽。是否是keil编译器的问题,还是C51就是如此规定的。我想应该和ANSI C做法一样,函数中的数组在栈内分配,函数执行完后清除栈。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

4
 
51没那么多栈用来分配变量,但是你认为的字符串一直存在也是不安全的,这个字符串虽然貌似存在,但是有可能被其他函数的其他变量覆盖。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

5
 
同意上面的说法,我一直没有找到一本比较权威的参考资料,来详细讲述有关KEIL这个编译器的特性.不过我个人的观点是,参考一下你系统所使用的MCU,我想你所定义的数组应该是放在CODE代码段里的.
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

6
 
不好意思,上面有一个小小的错误:我想你所定义的数组应该是放在CODE(应该是DATA)代码段里的
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(高级)

7
 
C51的局部变量一般都是预先分配的,跟静态变量差不多.如果你想它在栈上分配的话,可以在函数前添加reentrant,声明为可重入的函数
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表