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

时间:2013-01-28 15:47:04

标签: 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;
    }
}

更确切地说,这种语法对我来说是模糊不清的。

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

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

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

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

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

由于 DAN

2 个答案:

答案 0 :(得分:6)

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

然而,有一些问题:

  1. 在字符串文字的情况下,如果有任何东西试图修改返回的字符串,则会出现未定义的行为。实际上,此函数应返回const char *

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

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

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

答案 1 :(得分:3)

  

它会返回char *的内容吗?

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

  

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

通常,字符串文字存储在程序的数据(或rodata)段中。但这并不重要,相关的是字符串文字具有静态存储持续时间,因此代码有效且返回的指针不指向函数返回后不存在的局部变量。