Particle Photon上C++多维数组取值异常问题求助
搞定你的Particle Photon数组取值问题
嘿,我一眼就看到你代码里的两个关键问题,正是它们导致了那个奇怪的-1069809521值,而不是预期的1000。咱们一步步来拆解和修复:
1. 问题出在哪?
(1)错误的多维指针数组定义
你写的const int* FaceEmoteTimeArray [][FaceSize0] = {FaceEmoteTime0};有大问题:
FaceSize0是31(因为你声明了FaceEmoteTime0[31],哪怕只初始化了7个元素),所以这个二维数组的第二维度是31。- 你只给第一个位置
FaceEmoteTimeArray[0][0]赋值了FaceEmoteTime0(它会退化成int*),剩下的30个位置会被默认初始化为空指针。 - 当循环到
i>=1时,你试图解引用这些空指针(*FaceEmoteTimeArray[FaceNumber][i]),这属于C++里的未定义行为,会读取到内存里的随机垃圾值,就是你看到的奇怪数字。
(2)数组长度不符合预期
你声明了FaceEmoteTime0[31]但只初始化了7个元素,剩下的24个会被自动设为0,这也会让你的总和超出预期(原本只想算7个值的和)。
2. 修复后的代码
// 去掉固定长度,让编译器自动推导出实际初始化的7个元素 const int FaceEmoteTime0[] = {143, 143, 143, 142, 143, 143, 143}; // 现在FaceSize0会正确计算为7 const int FaceSize0 = sizeof(FaceEmoteTime0) / sizeof(FaceEmoteTime0[0]); // 改成一维指针数组,只存各个表情数组的指针,不需要多余的第二维度 const int* FaceEmoteTimeArray[] = {FaceEmoteTime0}; const int FaceSizeArray[] = {FaceSize0}; // 显式初始化TotalTime,虽然全局变量会默认设0,但显式写出来更清晰 int TotalTime = 0; int Plays = 0; int FaceNumber = 0; void setup() { Serial.begin(115200); } void loop() { if (Plays == 0) { for (int i = 0; i < FaceSizeArray[FaceNumber]; i++) { // 直接用指针数组访问元素,不需要额外解引用 TotalTime += FaceEmoteTimeArray[FaceNumber][i]; } Serial.println(TotalTime); // 现在会输出预期的1000 Plays++; } }
3. 关键改动说明
- 简化数组定义:把二维指针数组改成一维,因为你只需要存储多个一维数组的指针,不需要冗余的第二维度空间。
- 修正数组长度计算:让
FaceEmoteTime0的长度由初始化列表自动推导,这样FaceSize0就是7,正好对应你要计算的7个值。 - 修复元素访问方式:
FaceEmoteTimeArray[FaceNumber]已经是指向目标数组的指针,直接用[i]就能访问第i个元素,之前的额外*是画蛇添足,还触发了空指针解引用的错误。 - 显式初始化变量:虽然全局变量
TotalTime会默认初始化为0,但显式初始化能让代码更易懂,避免后续维护时的困惑。
这样修改后,代码就能正确计算总和,输出你想要的1000了。
内容的提问来源于stack exchange,提问作者hahman
相关产品推荐
相关产品推荐

