ESP32项目中二维数组行数计算函数返回值始终为1的问题
问题根源
在C/C++中,当二维数组作为参数传递给函数时,会退化为指向数组首元素的指针。ESP32是32位架构,指针大小为4字节,所以sizeof(rgb)返回4;而sizeof(rgb[0])是单个一维RGB数组的大小(3字节),4/3取整后得到1,这就是length始终为1的核心原因。
两种解决方案
方案1:手动传递数组长度
在定义数组的作用域内计算行数(此时sizeof能正确获取数组总大小),再将长度作为参数传入函数:
修改调用代码:
if (counter == 0) { uint8_t rgb[4][3] = { {0xff, 0x00, 0x00}, {0xff, 0x11, 0x11}, {0xea, 0x1f, 0x10}, {0xff, 0x00, 0x00} }; int rgbCount = sizeof(rgb) / sizeof(rgb[0]); // 此处计算得到正确的行数4 gradientFunction(rgb, rgbCount); Serial.println("Red gradient"); }
修改函数定义:
void gradientFunction(uint8_t rgb[][3], int length) { Serial.println(length); // 现在会打印正确的行数 for (int i = 0; i < length; i++) { uint8_t bytes[9] = {0x7b, 0x01 + i, 0x0e, 0xfd, rgb[i][0], rgb[i][1], rgb[i][2], length, 0xbf}; pRemoteCharacteristic->writeValue(bytes, 9); delay(100); } }
方案2:使用模板函数自动推导长度
利用模板让编译器在编译阶段自动推导数组行数,无需手动传递参数:
修改函数定义为模板:
template<int RowCount> void gradientFunction(uint8_t (&rgb)[RowCount][3]) { int length = RowCount; Serial.println(length); // 正确打印数组行数 for (int i = 0; i < length; i++) { uint8_t bytes[9] = {0x7b, 0x01 + i, 0x0e, 0xfd, rgb[i][0], rgb[i][1], rgb[i][2], length, 0xbf}; pRemoteCharacteristic->writeValue(bytes, 9); delay(100); } }
调用时无需额外修改,直接传入数组即可:
gradientFunction(rgb);
该方案的优势是适配任意行数的RGB数组,无需手动计算和传递长度。
内容的提问来源于stack exchange,提问作者siz
相关产品推荐
相关产品推荐

