下,我有一些代碼,似乎是安全的,因爲我可以把它...但我越來越EXC_BAD_ACCESS
。不經常介意,只是這一次。的iOS stringWithUTF8String(真的CFAllocatorAllocate)EXC_BAD_ACCESS崩潰,ARC
的代碼:
- (void) deviceListenerCallback:(DeviceEventTypeDef)type data:(void*)data
{
DeviceInfoDef* o = (DeviceInfoDef*)data;
char newName[256];
if (o->DeviceName) {
strncpy(newName, o->DeviceName, 255);
} else {
strncpy(newName, "(null)", 255);
}
NSString *deviceNameUTF8 = [NSString stringWithUTF8String:(const char *)newName];
'數據' 是由一個C庫傳遞給我們的指針。數據是存在的,並且沒有損壞。
從strncpy()函數結束在了newName的字符爲 「網絡音頻\ 0 \ 0 \ 0 \ 0 \ 0 ...」
的EXC_BAD_ACCESS
是當我打電話stringWithUTF8String的最後一行。錯誤是:
EXC_BAD_ACCESS (code=1, address=0x30303030)
調用堆棧是:
CFAllocatorAllocate
................................
5 +[NSString stringWithUTF8String:]
6 -[MyClass deviceListenerCall...
該項目ARC下運行。
任何人都可以指出新手的事情我必須做錯了什麼?
感謝,
-Ken
的原因strncpy()函數是O可能會爲NULL。在調用代碼有沒有保證,它不是,那麼斷言是不會來這裏是正確的做法。 – 2013-03-27 11:48:15
@KenCorey使用'函數strncpy()'不會在'O'是'NULL'兩種情況下提供幫助。因此,正確的做法是將'NSAssert'改爲'if(o!= NULL)'測試。如果'o'可以是'NULL',那麼提到這可能有助於回答你的問題。 – trojanfoe 2013-03-27 11:50:16