返回带有char*的字符串的内联声明

dfa*_*hin 3 c char

第一个给大家,第一个发布在这里.

今天我发现自己想知道这段代码是否正确,它是由朋友写的时间用于微控制器,我没有机会再问他了.

该程序工作正常,但我不能真正决定它是否运气好运(不要相信编程运气).我甚至不知道这篇文章的标题是否正确,对不起,如果它可能会产生误导.代码:

char  *textStatusErrorMessage( unsigned int codeStatus )
{
    switch ( codeStatus ) {

    case STATUS_1:
        return ( (char  *) " Status: 1 " );
        break;     
    case STATUS_2:
        return ( (char  *) " Status: 2 " );
        break;      
    default:
        sprintf( tmpBuf, " UNKNOWN STATUS   %03d ", codeStatus );
        return ( (char  *) tmpBuf ); //tmpBuf is global
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

更准确地说,这种语法对我来说有点模糊.

return ( (char  *) " Status: 1 " );
Run Code Online (Sandbox Code Playgroud)

它返回什么的char*?保存"Status:1"字符串在哪里?堆/堆栈???

实现时,字符串在函数的范围内,我假设在使用return语句离开函数后,我无法控制函数本身返回的指针.

从我看到的方式来看,我将拥有一个具有不同可能的字符串选项的全局数组,并返回指向CASE选择的正确数组的指针.所以我知道我返回的指针是一个明确定义的内存区域.

那么这段代码是错还是不错?哪个是最正确的解决方案?

谢谢DAN

Oli*_*rth 6

从理论上讲,这段代码是有效的; 字符串文字(例如" Status: 1 ")的类型char[]和生命周期等于整个程序的类型.

但是,有一些问题:

  1. 在字符串文字的情况下,如果有任何东西试图修改返回的字符串,则会发生未定义的行为.真的,这个函数应该返回一个const char *.

  2. 目前尚不清楚tmpBuf声明的位置,也不清楚它是否指向足够的内存来保存正在写入的数据.

  3. 只有一个 tmpBuf,所以每次调用此函数时,tmpBuf都会被覆盖.这可能会导致难以跟踪的错误.

  4. 演员阵容是不必要的.