iOS開發時OC與C的混編中,strcpy導致的記憶體溢位、野指標
阿新 • • 發佈:2019-01-30
在最近的專案開發中,由於需要使用C語言的演算法供給OC專案呼叫,所以研究了一下OC與C的混編及.a庫的相關生成。而在混編的過程中,C語言的演算法都能正常呼叫了,但是被一個問題困擾了很長一段時間,就是在連續呼叫的過程中,很容易丟擲野指標而導致程式崩潰,且Xcode無法捕捉相應的異常。下面是我的部分OC與C的混編程式碼:
NSString *strMsg = [[NSString alloc]initWithString:msg]; const char * a =[strMsg UTF8String]; int dataLen = (int)[[strMsg dataUsingEncoding:NSUTF8StringEncoding] length]; char *bufA = new char[dataLen]; bzero(bufA, sizeof(bufA)); strcpy(bufA, a); NSString *strKey = [[NSString alloc]initWithString:key]; NSInteger keyLen = [[strKey dataUsingEncoding:NSUTF8StringEncoding] length]; const char * b =[strKey UTF8String]; char *bufB = new char[keyLen]; bzero(bufB, sizeof(bufB)); strcpy(bufB, b); size_t bloklen = ((dataLen / 16) + (dataLen % 16 > 0 ? 1: 0)) * 16; a = nil; b = nil; char *bufC =(char *) malloc(bloklen); bzero(bufC, sizeof(bufC)); Encrypt(bufA, bufB, bufC, dataLen); bufA = nil; bufB = nil; free(bufC);
由於知道是因為開闢記憶體的時候才丟擲的野指標,所以搜尋了很多相關資料,最後才發現是由於使用了strcpy(char *,const char*)的方法的緣故。strcpy是C語言標準庫的函式,它是把從src地址開始且含有'\0'結束符的字串複製到以dest開始的地址空間,需要指定長度,且遇到被複制字元的串結束符"\0"才結束,所以容易溢位。所以我換成了另外一種複製函式void *memcpy(void *dest, const void *src, size_t n),就很好的解決了記憶體溢位的問題。
strcpy和memcpy主要有以下3方面的區別。
1、複製的內容不同。strcpy只能複製字串 ,而memcpy可以複製任意內容,例如字元陣列、整型、結構體、類等。
2、複製的方法不同。strcpy不需要指定長度,它遇到被複制字元的串結束符"\0"才結束,所以容易溢位。memcpy則是根據其第3個引數決定複製的長度。
3、用途不同。通常在複製字串時用strcpy,而需要複製其他型別資料時則一般用memcpy。