我正在为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
之外进行复制?
答案 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() {
}