Arduino Memcpy扭曲串行输出

时间:2019-07-07 23:55:16

标签: arduino memcpy

我正在为Arduino Uno写一些代码,其中涉及复制部分数组。使用memcpy会导致一个完全不相关的变量有时在串行输出中显得损坏。这是显示问题的必要代码。

byte cchar[8][8];
byte fbold[16][16];
void setup() {
  Serial.begin(9600);
}

void loop() {
  for (byte i = 0; i < 8; i++) {
    memcpy(cchar + i*8, fbold + 16 * i , 8);
    Serial.println(i);
    Serial.println(i);
  }
  delay(500);
}

我相信这应该重复输出以下内容:

1
1
2
2
3
3
4
4
5
5
6
6
7
7

但奇怪的是,它更像这样:(直接从串行监视器中获取)

0
0
1
1
2
2ff
4
5
4
4
5
5
6
6
7
7
0
0
1
1
2
2
3
3
4
4
5
5ff
7
07
7

在删除memcpy命令的情况下,它的输出与我期望的一样。 合理的结论是我的memcpy正在破坏i。 但是为什么呢? i应该不会超过7,cchar的长度是64个字节,我只复制8个字节,对吗?那么如何在cchar之外进行复制?

1 个答案:

答案 0 :(得分:0)

问题在于指针算法。 sizeof(*cchar)为8,因此cchar + 1的地址为cchar地址后的8个字节

这有效

byte cchar[8][8];
byte fbold[16][16];

void setup() {
  Serial.begin(115200);
  for (int i = 0; i < 16; i++) {
    for (int j = 0; j < 16; j++) {
      fbold[i][j] = j;
    }
  }
  for (int i = 0; i < 8; i++) {
    memcpy(cchar + i, fbold + i, 8);
    for (int j = 0; j < 8; j++) {
      Serial.print(cchar[i][j]);
      Serial.print(',');
    }
    Serial.println();
  }
}

void loop() {
}