3

先给大家打个招呼,先在这里发帖。

今天我发现自己想知道这段代码是否正确,它是一个朋友为微控制器写的,我没有机会再问他了。

该程序运行正常,但我无法真正决定它是否靠运气运行(不要相信编程运气)。我什至不知道这篇文章的标题是否正确,如果有误导,请见谅。编码:

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

更确切地说,这种语法对我来说有点晦涩难懂。

return ( (char  *) " Status: 1 " );

它返回一个字符 * 什么?“状态:1”字符串保存在哪里?堆/栈???

由于它的实现,字符串在函数的范围内,我假设在使用 return 语句离开函数后,我无法控制函数本身返回的指针中将写入的内容。

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

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

谢谢丹

4

2 回答 2

6

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

但是,有几个问题:

  1. 在字符串文字的情况下,如果有任何东西试图修改返回的字符串,那么就会发生未定义的行为。实际上,这个函数应该返回 a const char *

  2. 不清楚在哪里tmpBuf声明,也不清楚它是否指向足够的内存来保存正在写入的数据。

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

  4. 演员表是不必要的。

于 2013-01-28T15:50:36.040 回答
3

它返回一个char *什么?

它将char[]字符串文字是的转换为 a char*。这不是必需的,因为它会自动转换为char*那里。

“状态:1”字符串保存在哪里?堆/栈???

Typically, string literals are stored in the data (or rodata) segment of a programme. But that isn't important, what's relevant is that string literals have static storage duration, so the code is valid and the returned pointers don't point to local variables that don't exist after the function returns.

于 2013-01-28T15:51:07.413 回答