uint8_t数组单字节元素与整体多字节存储空间的原理疑问
uint8_t数组单字节元素与整体多字节存储空间的原理疑问
嘿,我来给你把这个疑问掰扯明白!
先看你提到的这段核心代码:
uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
你其实是混淆了数组元素的类型和数组整体的内存占用这两个核心概念啦:
uint8_t本身确实是单字节的整数类型,每个uint8_t变量只会占用1字节的内存空间;- 当你声明上面这个数组时,你创建的是一个由6个
uint8_t元素组成的数组——不是说整个数组是“单字节类型”,而是数组里的每一个独立元素都是单字节的uint8_t,所以整个数组的总内存大小就是 6 × 1字节 = 6字节,完全合理。
再结合你在Arduino Uno上写的测试代码来看:
void setup() { Serial.begin(115200); // #include <stdint.h> // Not needed in Arduino IDE with Arduino board selected. // #include <stdio.h> // Not needed in Arduino IDE with Arduino board selected. } void loop() { delay(3000); uint8_t numbers[] = {0xFF, 0x22, 0xA0, 0x3B, 0xC2}; // 5 elements & 5 bytes Serial.print("sizeof(numbers) "); Serial.println(sizeof(numbers)); // outputs = 5, (obviously the # elements in array) for (int i = 0; i <= 8; i++) { Serial.print("sizeof(numbers["); Serial.print(i); Serial.print("]) = "); Serial.println(sizeof(numbers[i])); } }
sizeof(numbers)返回5,正好是5个单字节元素的总大小;- 如果你运行这段代码,会发现
sizeof(numbers[i])不管i是多少(哪怕越界)都会返回1——这就是单个uint8_t元素的内存占用,也能验证每个元素确实是单字节。
另外提个小细节:你代码里的循环for (int i = 0; i <= 8; i++)有问题哦!你的numbers数组只有5个元素,索引范围是0到4,当i≥5的时候,访问numbers[i]属于数组越界访问,会读到内存里的随机垃圾值,实际写代码的时候要避免这种情况~
最后回到那个广播地址的例子:这种6字节的uint8_t数组通常用来存MAC地址(不管是以太网还是蓝牙的广播地址),因为MAC地址本身就是由6个字节组成的,每个字节的取值范围正好是0x00到0xFF,用uint8_t数组来存储完美匹配这个结构。
备注:内容来源于stack exchange,提问作者bittybytey




