IT人
相关图书

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;    
}

----------------------------------------------------------------------

如下改动:
/**************************************************************************
 *  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;    
}


--------------------------------------------------------

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

--------------------------------------------------------

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

--------------------------------------------------------

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

--------------------------------------------------------

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

--------------------------------------------------------

C51的局部变量一般都是预先分配的,跟静态变量差不多.如果你想它在栈上分配的话,可以在函数前添加reentrant,声明为可重入的函数
相关问题
    Copyright ◎ 1998 - 2007 编程资料网 All Rights Reserved