第一个给大家,第一个发布在这里.
今天我发现自己想知道这段代码是否正确,它是由朋友写的时间用于微控制器,我没有机会再问他了.
该程序工作正常,但我不能真正决定它是否运气好运(不要相信编程运气).我甚至不知道这篇文章的标题是否正确,对不起,如果它可能会产生误导.代码:
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
从理论上讲,这段代码是有效的; 字符串文字(例如" Status: 1 ")的类型char[]和生命周期等于整个程序的类型.
但是,有一些问题:
在字符串文字的情况下,如果有任何东西试图修改返回的字符串,则会发生未定义的行为.真的,这个函数应该返回一个const char *.
目前尚不清楚tmpBuf声明的位置,也不清楚它是否指向足够的内存来保存正在写入的数据.
只有一个 tmpBuf,所以每次调用此函数时,tmpBuf都会被覆盖.这可能会导致难以跟踪的错误.
演员阵容是不必要的.