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

时间:2014-06-01 03:53:47

标签: c++ arduino

我的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

1 个答案:

答案 0 :(得分:0)

您的数组在标题中声明错误:

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

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

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

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

你的程序当前有未定义的行为(你正在写“数组”的末尾),所以无论你观察到什么(你实际上是通过你的对象写一些记忆)都可以认为是巧合。

你在同一个位置写了两次(一个零大小的数组大小为......零)的事实解释了为什么它看起来像“两个数组都有相同的地址”,但是有未定义的行为,还有其他的东西可能会发生。