个人技术分享

首先现象是我在用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正是通过这个区别做不同处理返回不同结果。

通过这个小小细节也就不难醒悟到,不要因为一点小小的成就就沾沾自喜,我所掌握的可能仅仅只是冰山一角,骄兵必败,踏踏实实一步一个脚印的去做,即使失败也是帅气的,还有就是比赛的时候最好不要搞创新,以免产生不必要麻烦,当然平常练习多科研还是很好的,像现在这样把坑都踩了,比赛的时候容错率就跟高了