我正在使用ESP-IDF和FreeRTOS设计ESP32的固件。 我想将传感器的读数转换为char数组并将其存储在非易失性存储中。读取新读数时,会将其添加到char数组的前面,将较旧的读数推向右侧。
我以这种方式进行数组操作:
#define MAX_BYTES 100
char oldData[MAX_BYTES];
char newData[15];
sprintf(newData, "%.2f", Totalmass);
strcat(newData, ",");
int newlen = strlen(newData);
int looper = (sizeof(oldData) - newlen - 1);
for(int i = looper; i >= 0; i--) {
oldData[i + newlen] = oldData[i];
}
looper = strlen(newData);
for(int i = 0; i < looper; i++) {
oldData[i] = newData[i];
}
printf("strlen final Data:\n", strlen(oldData));
printf("Final Data: %s\n", oldData);
现在要解决我面临的问题:
oldData的长度超过100,即MAX_BYTES,则oldData的长度为100 +最新读数的长度。在打印最终数组时,我看到最新的数据被连接到最前面(这是理想的),但是它也增加了数组的末尾。这可能就是为什么我的数据长度比我最新数据的长度超出MAX_BYTES的原因。
输出:
strlen final Data: 112
Final Data: -3129344.00,0.00,0.00,0.00,0.00,0.00,2796202.00,-8388604.00,133152.00,0.00,0.00,0.00,0.00,0.00,0.00,-3129344.00,
如果您看到上述输出,则长度超过MAX_BYTES 12,这是最新读数的长度,即“ -3129344.00”。并且该数据出现在数组的开头和结尾。
为什么会发生这种不必要的行为?谁能注意到我做错了什么?
这个问题只是出于我的好奇心。为什么即使长度超过其大小数组也不会溢出?我注意到,当代码超出大小时,它会更早崩溃。
在此先感谢所有遇到我的问题的人!