前兩天在除錯usb hid類雙向通訊的時候遇見這樣乙個問題:
在usb_endp.c檔案中編寫ep1_out_callback函式程式用於讀取usb裝置端收到的資料。然後在main.c主函式中將資料通過usb傳送出去。
程式如下
usb_endp.c中的程式
uint32_t datalen=0;
uint8_t *p;
void ep1_out_callback(void)
main.c中的程式、
extern uint32_t datalen;
extern uint8_t *p;
int main(void)}}
}
出現的問題就是:我用上位機通過主機給usb裝置發資料,結果usb裝置收到資料存到*p裡,通過主函式裡在把*p裡資料發到usb主機上位機上,顯示傳送的資料與接收的資料不符。
經過研究發現問題出在指標變數上(上面程式標紅的地方)。
檢視c語言書籍,發現了問題的所在:
定義乙個指標變數 int *p,則指標變數名是p,而不是*p,即「*」不是指標變數名的一部分,在定義變數時,在變數名前加乙個「*」表示該變數是指標變數。*p是指標變數p所指向的變數。在上面的程式中,我們宣告uint8_t *p,但是沒有的對p賦值,因此p並無確定的值(它的值是不可預見的),也就是說p所指向的單元是不可預見的,在這種情況下,對*temp賦值是一件很危險的事情(即usb_sil_read(endp1,
p);將資料放入到指標變數p指向的位置,實際上是未知的)可能會破壞系統的正常工作。由此可見我們出現問題的原因就是未對*p做乙個初始化。
所以要改正這個問題就是需要用另外乙個變數對*p做初始化。比如
int *p;
int a=10;
p=&a;
或者是用陣列來完成這個工作。本次我使用的是陣列來完成這個工作,修改後的程式如下
usb_endp.c中的程式
uint32_t datalen=0;
uint8_t kk[64];
void ep1_out_callback(void)
main.c中的程式、
extern uint32_t datalen;
extern uint8_t kk[64];
int main(void)}}
}
c語言不紮實呀!!!
關於指標變數的問題
關於指標變數的問題 int a 12 在儲存器中開闢乙個儲存區域,佔據4個位元組,比如首位址是1234,int p 定義乙個指標變數 p a p指向a,就是說將a的位址儲存在p中 在這個過程中,變數a是將首位址1234,儲存在指標變數p中嗎?輸出 a的值都是十進位制的嗎?在變數a中12的二進位制是0...
指標變數的應用
指標變數使用必須遵從如下三個步驟 1.定義指標變數 2.為指標變數分配記憶體 3.使用指標變數 注 如果在定義完指標後,沒有給指標 賦初值,這個指標就是野指標,這個野指標 可能導致不可預期的後果。如何規避野指標,在定義指標的時候賦null 指標和一維整形陣列 int a 5 int p a a i ...
指向指標的指標變數的應用
在前面已經介紹過,通過指標訪問變數稱為間接訪問,簡稱間訪。由於指標變數直接指向變數,所以稱為單級間訪。而如果通過指向指標的指標變數來訪問變數則構成了二級或多級間訪。在 語言程式中,對間訪的級數並未明確限制,但是間訪級數太多時不容易理解解,也容易出錯,因此,一般很少超過二級間訪。指向指標的指標變數 說...