我从一个非常简单的函数中经历了一些非常奇怪的行为:一个整数传递给函数,并且根据它的值将返回一个特定于该整数的unsigned char。
我一直遇到一个问题,它会向那些硬编码到函数中的值返回一个不同的值。我已经多次重写代码以使其停止发生,但我已经找到了一种方法来重新创建它,以便说明不应该改变返回值的事情。< / p>
下面是一个示例草图来说明:
unsigned char* brokenFunction(int id)
{
switch (id)
{
case 0:
{
//Serial.println("Break it...");
unsigned char retval[8] = {
0b01110,
0b11011,
0b10001,
0b10001,
0b10001,
0b10001,
0b10001,
0b11111
};
return retval;
}
break;
case 5:
{
unsigned char retval[8] = {
0b01110,
0b11011,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111
};
return retval;
}
break;
}
}
void setup()
{
Serial.begin(9600);
unsigned char* array = brokenFunction(0);
Serial.println(*array);
}
void loop()
{
}
第7行是对Serial.println
的调用,该调用目前已被注释掉。如果您在Arduino上运行草图并注释掉此行,则Serial.println
函数中的setup
调用将返回值14
(这是正确的)。
但是,如果您取消注释第7行,Serial.println
函数中的setup
调用现在将返回看似随机值的内容;对于我的上一次测试,它是值91
;请参阅下面的串行窗口日志:
14
Break it...
91
正如您所看到的,我的第一次尝试返回14,但随后使用额外Serial.println
调用的尝试导致返回值被更改。
有谁知道这里可能出现的问题?还有其他我设法复制过的东西,但这是最简单的一个例子。它几乎就好像,如果函数花费的时间稍长一些,那么返回值会被损坏一些。
非常感谢任何帮助或想法。
答案 0 :(得分:2)
您正在从函数brokenFunction(int id)
返回一个本地数组,该函数在您返回时停止存在,从而导致从该点开始的未定义行为。