首先现象是我在用LORA发送信息的时候,左边显示长度是8而右边接收到的数据长度却是4
我以为是OLED显示屏坏了,又或者是我想搞创新用了const char* 类型强制转换数据的原因,结果发现都不是
void Function_SendMsg( unsigned char* data){
unsigned char len = sizeof(data);
sprintf((char* )ARRAY2, "%d", len);
OLED_ShowString(2, ARRAY2);
LORA_Tx((unsigned char* )data, len);
len = sizeof(data);
sprintf(ARRAY2, "%d", len);
//OLED_ShowString(2, ARRAY2);
OLED_ShowString(0, ARRAY2);
}
最终发现原因出在这个函数这个函数的len输出一直是4,而下面的输出是20
#include<stdio.h>
unsigned char ARRAY1[20];
void Function_GetLen(unsigned char* data){
unsigned char len = sizeof(data);
printf("函数中的字符串长度:%d", len);
}
int main(){
printf("%d\n", sizeof(ARRAY1));
Function_GetLen(ARRAY1);
}
将问题简化成上述代码,data指针指向ARRAY1数组,ARRAY1数组的sizeof肯定是20,那么sizeof(data)的输出也应该是20
但输出结果如下:
我非常不理解,查过sizeof资料后发现
当使用 sizeof 运算符作用于数组时,得到的是整个数组的大小,而不是数组首元素的指针的大小,同样,当您使用 sizeof,运算符作用于指针时,您得到的是指针本身的大小,而不是指针所指向的数据的大小。
也就是说虽然data是指向ARRAY1的但是data本身是个指针,size of 后返还的是指针大小,而ARRAY1是数组,应该在编码的时候就区分了ARRAY1和data的区别,本质上虽然ARRAY1和data都是指针类,但细分的话他俩又有明显区别,size of正是通过这个区别做不同处理返回不同结果。
通过这个小小细节也就不难醒悟到,不要因为一点小小的成就就沾沾自喜,我所掌握的可能仅仅只是冰山一角,骄兵必败,踏踏实实一步一个脚印的去做,即使失败也是帅气的,还有就是比赛的时候最好不要搞创新,以免产生不必要麻烦,当然平常练习多科研还是很好的,像现在这样把坑都踩了,比赛的时候容错率就跟高了