首先現象是我在用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正是通過這個區別做不同處理返回不同結果。
通過這個小小細節也就不難醒悟到,不要因為一點小小的成就就沾沾自喜,我所掌握的可能僅僅只是冰山一角,驕兵必敗,踏踏實實一步一個腳印的去做,即使失敗也是帥氣的,還有就是比賽的時候最好不要搞創新,以免產生不必要麻煩,當然平常練習多科研還是很好的,像現在這樣把坑都踩了,比賽的時候容錯率就跟高了