1. 程式人生 > >strstr造成的非對齊訪問錯誤

strstr造成的非對齊訪問錯誤

extern char *strstr(char *str1, const char *str2);

大家都知道函式用於判斷字串str2是否是str1的子串。如果是,則該函式返回str2在str1中首次出現的地址;否則,返回NULL。具體用法這裡就不多說,網上資源很多。

char *buf_check = NULL;

buf_check = strstr((const char*)gprs_rx,(const char*)"YQD1");//假設gprs_rx = "190.168.1.12,778,bbbABCDEFFFF"

專案中用的是STM32配一個GSM模組,主要對來自伺服器的資料進行處理。之前碰到一個問題,就是接正式環境沒有問題,但是接測試環境,一收到伺服器的資料就進入HardFault,完全是一樣的程式碼,只是IP和埠不一樣而已,一直想不明白,後來單步除錯檢視接收資料的緩衝區和指標地址。gprs_rx是伺服器下發的資料,buf_check儲存"ABC"之後的字串。區域性變數是存放在堆疊裡面的,檢視gprs_rx存放起始地址是0x20000100 ,正常情況下buf_check的起始地址是0x20000114(可以被4整除),沒有問題.換測試IP(190.168.12.12

)之後,由於Ip長度多了一個位元組,導致buf_check的起始地址是0x20000115(不能被4整除,也就造成了堆疊的非對齊訪問)。進行對齊訪問處理之後問題解決。

就是ARM系列處理器的記憶體訪問要求資料對齊。也就是起始地址是一個word長度的整數倍,通常是4位元組對齊。