繁体   English   中英

多个int数组指向相同的内存地址?

[英]Multiple int arrays pointing to same memory address?

我的Arduino代码中有一个错误,对我来说似乎没有道理。 总体而言,此代码将通过存储有关要演奏到压电(单音扬声器)的音符的频率和持续时间的信息来演奏音乐。 为了节省内存,我声明/初始化了两个单独的数组(作为名为TuneManager的类的一部分),该数组将保存下一组频率/持续时间,并带有两个索引:currentNoteIndex(跟踪下一个要播放的音符) )和loadableNoteIndex(可跟踪数组中下一个可以被新注释信息覆盖的位置)。

int currentNoteIndex = 0;
int loadableNoteIndex = 0;
int tuneFreq[MAX_NOTE_BUFFER];
int tuneDur[MAX_NOTE_BUFFER];

然后,当需要将更多音符加载到这些数组中时,我从代表歌曲的字符串中解密它们,并按如下方式加载它们:

tuneFreq[loadableNoteIndex] = atoi(noteFreq);
tuneDur[loadableNoteIndex] = atoi(noteDur);

如果我同时打印出noteFreq和noteDur变量,则会得到期望值。 不幸的是,如果我取出保存的数组值,则会得到错误的输出。

Serial.print(tuneFreq[loadableNoteIndex]);
Serial.print(" ");
Serial.print(tuneDur[loadableNoteIndex]);

例如,如果noteFreq为150,但noteDur为200,则输出将为“ 200 200”,而不是预期的“ 150 200”。 另外,如果在打印之前切换分配语句的顺序,它将打印“ 150 150”而不是“ 200 150”。 这使我相信两个数组都以某种方式引用了相同的内存地址,但是我无法找出问题所在。

如果需要完整的代码,请在此处查看TuneManager cpp和h文件: https : //github.com/bajuwa/RoboKitty/tree/TuneBuffer/EightBitTunes

您的数组在标头中的声明不正确:

private:
  int tuneFreq[];
  int tuneDur[];

这声明了两个零大小的数组(即使您在源文件中分配数组也没关系),这是非法的(某些编译器,例如GCC允许它们)

您必须在标头中声明大小,以使编译器知道您的类型的大小:

private:
  const int MAX_NOTE_BUFFER = 25;
  int tuneFreq[MAX_NOTE_BUFFER];
  int tuneDur[MAX_NOTE_BUFFER];

您的程序当前具有未定义的行为(您的写操作超出了“数组”的末尾),因此,无论您观察到什么(实际上是通过对象写一些内存)都可以视为偶然的。

您在同一位置写入两次(零大小的数组的大小为...零)的事实说明了为什么看起来像“两个数组都具有相同的地址”,但是如果行为不确定,则可能发生任何其他情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM