この質問は、この1のようになります。Serial.println changes return value of function (Arduino)なぜSerial.println()は関数内の配列の値を変更するのですか?
私はバイト配列を受け取り、ローカルの一時的なバイト配列を使用して、その値を変更する機能、test(byte _b[])
を、持っています。そのローカルバイト配列は、関数test
が返ってきたときに破棄されるので、呼び出し側はそれにアクセスできなくてすみます。しかし、Serial.println()は、ローカル配列を呼び出し側がアクセスできるようにします。 なぜですか?これはメモリリークのようですか?
コード(アルドゥイーノ1.6.12、64ビットのDebianジェシーで試験):MARKEDなし
init
_07
testing: _07
---------
_07
testing: _07
---------
:標線と
uint32_t timer;
void setup() {
Serial.begin(57600);
Serial.println("init");
}
void loop() {
if (millis() > timer) {
timer = millis() + 1000;
// many bytes need escaping, so we better use the URLencode function
byte testarray[3];
test(testarray);
Serial.print("testing: ");
Serial.println((char *) testarray);
Serial.println("---------");
}
}
void test(byte _b[]) {
byte c[4];
c[0] = 95; c[1] = 48; c[2] = 55; c[3] = 0;
_b = c;
Serial.println((char *) c); // MARKED: this is the line that causes the unexpected behaviour
}
は、私は、次の出力を得ますライン、私はこれを取得:
init
testing:
---------
testing:
---------
testing:
---------
testing:
---------
testing:
---------
まあ、 'char *'を表示するJavaプログラムは、予期せぬ動作を起こすことになっています。これを適切にタグ付けしてもよろしいですか? –
どういう意味ですか?Stackoverflowは "Java"タグを提案しました。 Arduino IDEはJavaで書かれていませんか? –
Stack Overflowの提案に従うことは義務ではありません。そしてArduino IDEが書かれている言語は無関係です。 ArduinoはCまたはC++で書かれたコードをサポートしているということを私が理解していれば間違いないかもしれません。だから、基本的に、あなたはCやC++の何かの助けを借りてスタックオーバーフローのJava開発者に尋ねました。 Javaタグを削除してCタグまたはC++タグを置くと、より良いヘルプが得られます。 –