1. 程式人生 > >iOS開發時OC與C的混編中,strcpy導致的記憶體溢位、野指標

iOS開發時OC與C的混編中,strcpy導致的記憶體溢位、野指標

在最近的專案開發中,由於需要使用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。