//串列埠相關的標頭檔案
#include /*標準輸入輸出定義*/
#include /*標準函式庫定義*/
#include
#include
#include /*檔案控制定義*/
#include /*標準輸入輸出定義*/
#include /*錯誤號定義*/
#include /*posix終端控制定義*/
#include
#include
#include
#include
#include
#ifdef __cplusplus //跨平台定義方法
extern "c" ,,,
,,}; //絕對值編碼器的圈量,連續讀取3byte(絕對值編碼器1byte,1圈內脈衝數2byte)
void memodbuscrc(char *data,int numcnt,char *crclow,char *crchigh) //計算crc值
else}}
*crchigh=crc>>8&0xff;
*crclow=crc&0xff;
printf("%c\n",*crchigh);
printf("%c\n",*crclow);
}int main(int argc,char **argv)
#ifdef __cplusplus
}#endif
在ubuntu 12.0.4上用gcc4.6.3通過g++ a.c -o a -wall -fexecptions -o2報錯,估計是ubuntu加了越界檢查,但是在gcc4.8以上的版本卻沒有問題,通過gdb除錯發現原因是因為unsigned int operaorder未初始化,將其初始化為0則通過。
修改後的**如下:
//串列埠相關的標頭檔案
#include /*標準輸入輸出定義*/
#include /*標準函式庫定義*/
#include
#include
#include /*檔案控制定義*/
#include /*標準輸入輸出定義*/
#include /*錯誤號定義*/
//#include /*posix終端控制定義*/
#include
#include
#include
//#include
#include
#ifdef __cplusplus //跨平台定義方法
extern "c" ,
// ,
// ,
// ,
// ,
// }; //絕對值編碼器的圈量,連續讀取3byte(絕對值編碼器1byte,1圈內脈衝數2byte)
char opera[5][10]=,,
,,,}; //絕對值編碼器的圈量,連續讀取3byte(絕對值編碼器1byte,1圈內脈衝數2byte)
void memodbuscrc(char *data,int numcnt,char *crclow,char *crchigh) //計算crc值
else}}
*crchigh=crc>>8&0xff;
*crclow=crc&0xff;
printf("%d\n",*crchigh);
printf("%d\n",*crclow);
}int main(int argc,char **argv)
;memodbuscrc(&opera[operaorder][0],8,&crclow,&crchigh);//計算crc校驗值
// printf("framecode[i]=%c",framecode[i]);
}#ifdef __cplusplus
}#endif
1,這個是operaorder = 100 能輸出 但是是全0;
2,這個是正確的
3,這個是未初始化的輸出,資料時亂的,指向未知位址
4,這個是這個是release版本的
5,這個是operaorder = 10000 陣列越界,說明gcc做了優化,促使分配的
所以,一定要養成宣告變數後初始化的習慣,有些編譯器會幫忙初始化,但是不能保證所有的編譯器都幫你。
乙個GCC4 6 3的奇妙問題的糊塗解決方案
因為工作中需要opencv,又不想用windows,所以我就在linux下編譯安裝opencv了。一開始,由於我的計算機不能安裝ubuntu12.04,所以我安裝了ubuntu13.04,opencv的環境也配置的很順利。在13.04上安裝完成opencv後,我便興沖沖的實驗了一把,其實我的程式什麼...
Linux 程式設計 如何除錯GCC段錯誤 轉
編譯gcc時加上 enable checking。同時使用 g和 o0選項,使得編譯出的二進位制程式可以使用gdb除錯。編譯測試用例時加上 v da q。然後使用gdb獲得呼叫棧資訊 bash gdb cc1 gdb run arguments cc1 將會在段錯誤出現時停止執行 gdb where...
段錯誤?打的就是段錯誤!!
呵,段錯誤?自從我看了這篇文章,我還會怕你個小小段錯誤?請開啟你的linux終端,跟緊咯,準備發車!嘟嘟嘟噠 include void errfunc intmain 這段 拿去執行,肯定段錯誤。系統會在程式崩潰的那一剎那將整個核心的資訊記錄在乙個檔案裡邊。如果你是第一次,那麼ls是查不到的。這樣 ...