首先向大家致敬,先发布一下。
今天我发现自己想知道这段代码是否正确,很久以前是朋友写的一个微控制器,我没有机会再问他了。
该程序工作正常,但我无法确定它是否运气好运(不要相信编程运气)。 我甚至不知道这篇文章的标题是否正确,对不起,如果它可能会产生误导。 代码:
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
答案 0 :(得分:6)
理论上,这段代码是有效的;字符串文字(例如" Status: 1 "
)的类型为char[]
,生命周期等于整个程序的生命周期。
然而,有一些问题:
在字符串文字的情况下,如果有任何东西试图修改返回的字符串,则会出现未定义的行为。实际上,此函数应返回const char *
。
目前尚不清楚tmpBuf
的声明位置,也不清楚它是否指向足够的内存来保存正在写入的数据。
只有一个 tmpBuf
,因此每次调用此函数时,tmpBuf
都会被覆盖。这可能会导致难以追踪的错误。
演员阵容是不必要的。
答案 1 :(得分:3)
它会返回
char *
的内容吗?
它将字符串文字所在的char[]
强制转换为char*
。这不是必需的,因为它会在那里自动转换为char*
。
保存“Status:1”字符串在哪里?堆/堆栈???
通常,字符串文字存储在程序的数据(或rodata)段中。但这并不重要,相关的是字符串文字具有静态存储持续时间,因此代码有效且返回的指针不指向函数返回后不存在的局部变量。